`

Spring,Struts2,Shiro中使用google验证码Kaptcha 获取不到session中验证码的解决方法

阅读更多

Spring,Struts2,Shiro中使用google验证码Kaptcha 获取不到session中验证码的解决方法

 

Kaptcha验证码的原理:

 

前台请求一个图片,该图片src属性指向的url其实是在web.xml中配置的一个servlet,该servlet由Kaptcha提供,

 

就是随机生成一串字符,然后存入session中,再将字符转成图片传到前台.

 

验证时,前台输入验证码传到后台,后台从session中取出原始的验证码跟前台传过来的比对,

 

看看是否一致.

 

使用Spring,Struts2,Shiro这三个框架后,发现验证码的session老是为null.

 

其中,Shiro的session配置的是org.apache.shiro.web.session.mgt.DefaultWebSessionManager

这个SessionManager完全取代了容器中的Session管理器.

 

分析一下,验证码产生的流程:

(1) 前台请求验证码

(2) 后台收到请求,创建session,然后将验证码装入Session中

 

验证流程

用户点击登录按钮,发送一个ajax请求到后台,后台负责处理请求的Action试图从Session中取出原始验证码.

 

问题就出在取原始验证码的步骤中,取出的是null.

 

分析原因: 验证码产生时的Session可能和ajax登录请求的Session不是一个Session,导致取不到原始验证码.

 

写了个Session的监听器发现确实在发送ajax登录请求时生成了一个新的session和获取验证码时的Session不同.

 

网上搜索发现:

 

"在用Struts的时候发现这样一个问题,不管我们的程序中是否创建了一个新的session,从页面提交表单到action类,

再跳转到页面的时候url中总是出现了;jsessionid这样的一长串内容,这是由于新建的session导致容器产生的。

 

经过深入研究struts的代码发现问题所在,原来是struts在处理自动Locale时导致的,struts调用了request.getSession()方法,

该方法等同于 request.getSession(true) ,相当于不存在session时就自动创建一个新的session,于是就出现前面提到的现象。

 

要解决这个问题必须关闭struts的自动Locale的功能,不过很简单,只用在struts-config.xml的controller配置增加一个locale参数值等于false即可,"

 

问题的原因估计是struts2重新生成了一个Session.

 

结合看了下web.xml中struts的过滤器配置和shiro的过滤器配置,发现,struts的过滤器在shiro的过滤器前面.

 

这样在发送获取验证码的请求时,请求先被struts的过滤器拦截,struts发现Session不存在,就先产生了一个Session(A),并且验证码也是存储在这个Session(A)中的.

 

紧接着shiro的过滤器因为使用了自己的SessionManager,貌似不能使用前面struts已经创建的Session(A),于是又创建了一个Session(B)(这里纯推测),

 

导致Session变化了.

 

然后,再次调用ajax登录请求准备检查验证码是否正确.这是,其实还是struts先拦截了请求,但是发现已经有Session(B)了(是前面shiro创建的)(貌似struts能使用shiro创建的Session?)

 

这样struts是用了这个Session(B),而验证码是存在Session(A)中的.

 

解决的办法:

 

没有通过网上搜到的修改struts-config.xml的controller配置的(因为不知道在神马地方修改)

 

只需要在web.xml中将shiro的过滤器配置放到struts的过滤器配置前面.

 

切记, 用到shiro框架最好把该框架需要在web.xml中配置的过滤器配置成 第一个 过滤器.

 

1
1
分享到:
评论

相关推荐

    struts2shiro2springhiberante整合样例代码

    Struts2、Shiro、Spring和Hibernate是Java开发中常用的四大框架,它们分别负责MVC架构的展现层、安全管理、依赖注入与业务逻辑控制以及持久层操作。将这四个框架整合在一起,可以构建出功能强大且结构清晰的企业级...

    shiro+struts2+mybatis+spring整合实例

    在"shiro+struts2+mybatis+spring整合实例"中,开发者通常会按照以下步骤进行: 1. **配置Spring**:设置Bean定义,包括DataSource、SessionFactory(MyBatis)、Shiro的相关组件(如Realm、SecurityManager等)...

    spring shiro项目

    Spring Shiro项目利用Spring的依赖注入特性,可以方便地在Spring环境中使用Shiro。通过配置Spring的Bean,我们可以将Shiro的Realm与数据源连接,实现从数据库中获取用户、角色和权限信息。 7. **Shiro配置** 配置...

    struts2与spring实现简单登陆

    Struts2和Spring是两种非常流行的Java开源框架,它们在企业级Web开发中扮演着重要角色。Struts2主要用于处理用户请求和展示视图,而Spring则提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,以及丰富的企业...

    SSH整合Shiro源码

    - 配置Struts2拦截器:在struts.xml中添加Shiro拦截器,如`shiroFilter`,并将其插入到全局拦截器链中。 - 处理登录和登出请求:编写Action来处理用户的登录和登出请求,Shiro会自动处理认证和授权。 6. **...

    struts2权限管理系统

    它主要利用Struts2作为MVC框架,结合其他组件如Hibernate进行数据持久化,Spring进行依赖注入,以及Apache Shiro或Spring Security等进行权限控制,为企业提供了一种高效、灵活的权限管理解决方案。 首先,Struts2...

    Apache Shiro教程

    - **Spring整合**:Shiro可以无缝集成到Spring应用中,利用Spring的依赖注入管理Shiro组件。 - **Web框架集成**:如Struts、Spring MVC等,通过拦截器实现Shiro的安全控制。 7. **学习资源** - **官方文档**:...

    Shiro入门.rar

    Shiro 可以轻松集成到Spring、Struts、Servlet容器等环境中,提供更灵活的安全控制。 通过阅读提供的笔记和研究源码,你可以深入理解Shiro的工作原理,并掌握如何在实际项目中应用Shiro进行安全控制。无论是简单的...

    深入浅出学Shiro

    - **Web 应用中的 Session**:Shiro 可以轻松地集成到 Web 应用中,提供高效的 Session 管理。 #### 八、Shiro 和 Spring 的集成 Shiro 与 Spring 的集成非常紧密,可以实现: - **基本应用配置**:使用 Spring ...

    权限分配Shiro案例(推荐)

    4. **拦截器和过滤器**:在Spring MVC或Struts2等框架中,Shiro可以集成到拦截器或过滤器链中,以控制对URL或方法的访问。例如,我们可以配置一个`shiroFilter`,设定不同的URL路径需要的权限级别。 5. **会话管理*...

    Struts+Spring+Hibernate整合例子中的图片

    例如,使用Struts的拦截器来处理全局的异常,使用Spring的ResourceBundleMessageSource实现多语言支持,以及利用Spring Security或Apache Shiro来增强应用的安全性。 总之,Struts、Spring和Hibernate的整合是Java ...

    Shiro安全开源框架的介绍

    - 如何配置Shiro以支持Spring应用,包括Web应用配置,以及Shiro与Spring MVC、Struts2的集成。 Shiro的缓存(Cache)管理: - Shiro提供了缓存API和配置使用方式,支持包装使用其他Cache框架,并提供了缓存数据...

    非maven的ssm整合shiro

    SSM(Spring、Struts2、MyBatis)框架与Apache Shiro的整合是非Maven项目中常见的安全控制实现方式。Shiro是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常方便地与Spring、Struts2...

    shiro 教程

    同时,Shiro支持与Struts2和SpringMVC集成,为使用这些框架的应用程序提供了安全控制。 ### Shiro的Web 在Web环境下,Shiro提供了对Web请求的拦截和安全处理,能够保护Web资源。通过配置过滤器链,可以将Shiro的...

    SSH+shiro+tiles登录示例

    在Action中,我们可以使用Shiro的`SecurityUtils`类获取Subject对象,然后调用`subject.login()`方法尝试登录。Shiro会自动与我们在配置文件中定义的认证机制进行交互,比如使用`AuthorizingRealm`进行数据库查询...

    深入浅出学shiro

    - **多个Realm**:Shiro支持在一个应用中使用多个Realm来管理不同的数据源。 #### Shiro的授权 Shiro提供了丰富的授权机制,可以根据业务需求选择合适的授权方式。 - **编程授权**:通过代码实现授权逻辑。 - **...

    struts2做的权限

    6. **动态方法访问**:为了更细粒度的权限控制,可以使用Struts2的动态方法访问特性,将权限信息绑定到Action的特定方法上,而非整个Action。 7. **AOP(面向切面编程)结合**:Struts2的拦截器机制与AOP有相似之处...

    Shiro安全验证框架

    Shiro设计简洁,易于与其他框架集成,如Spring、Struts等,可以在不改变原有架构的基础上增强应用的安全性。 8. **源码分析**: 通过提供的源码,开发者可以深入理解Shiro的内部工作原理,学习如何定制化Shiro以...

    shiro学习示例

    - **Web应用集成**:Shiro可以很好地与Spring Boot、Struts等Web框架集成,提供安全控制。 - **API安全**:对于RESTful API,Shiro可以用来保护敏感接口,防止未授权访问。 - **权限控制**:Shiro的`hasRole()`和...

    Shiro和AJAX完美整合

    Apache Shiro 和 AJAX 的整合是现代 Web 应用程序中常见的需求,特别是在使用 Spring(SSH 框架的一部分)开发企业级应用时。Shiro 是一个强大且易用的 Java 安全框架,提供了身份验证、授权、会话管理和加密等功能...

Global site tag (gtag.js) - Google Analytics