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中配置的过滤器配置成 第一个 过滤器.
相关推荐
手把手教你集成spring cloud + shiro微服务框架;用最少的工作量,改造基于shiro安全框架的微服务项目,实现spring cloud + shiro 框架集成。博客地址:...
shiro 框架没有用tomcat的session,而是重新实现了一套。所以系统一旦引入shiro后,采用传统的tomcat session共享机制是无效的,必须采用面向shiro 的session共享。 网上针对“shiro session共享”的文章比较多,...
struts2shiro2springhiberante整合样例代码 对应博文地址:http://blog.csdn.net/javaee_ssh/article/details/42834949
基于hibernate spring struts shiro activiti easyui框架的物流系统,可做毕业设计代码自己看着视频手打的,可以运行,内涵数据库 说明等,适合做毕业设计和课程答辩
整合shiro kaptcha struts2 用myeclipse开发,适合初学者
SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 ...
struts2和shiro整合的解决方案很少,别的资源你别下载了,我试过了都是不好用的,这个是绝对好用的。带登陆和退出,还有角色的配置和使用。
shiro+struts2+mybatis+spring整合实例.
1、shiro+strut2 2、shiro注解 + struts2注解 2、shiro 缓存:因为使用了缓存,第一使用admin登录,如果没有logout,再用test登录,则test具有admin的权限
本资源提供了一套基于Spring4和Struts2的简单Shiro项目设计源码。该项目包含了11个XML配置文件、9个Java源文件、4个JSP文件、1个LICENSE文件、1个Markdown文件、1个META-INF文件、1个SQL文件、1个XSD文件,共29个...
关于shiro+struts2+hibernate+Spring+sitemash框架的毕业设计管理系统
基於springboot的shiro項目,使用了zuul等springcloud項目
本demo为Spring boot整合shiro,以mybatis plus做dao层交互数据,实现了读取数据库用户数据实现用户登录,权限认证,读取数据库中用户对应的url请求,实现请求的过滤。自定义了relam和过滤器来实现这些功能
SpringSecurity与shiro的使用
springboot +shiro+redis实现session共享(方案二)1
myeclips直接用shirodemo(spring3+shiro)(认证授权)
适用于spring集成的javaweb环境
spring boot+shiro 权限认证管理案例 shiro搭配缓存处理
Spring Shiro 学习系统 Spring-Shiro-training,适合初学者。
此项目有shiro验证码的实现,更改用户userState状态可以实现用户锁定,密码次数过多未写(异常类型为ExcessiveAttemptsException),自己累计次数吧。 五: 此例子是给一哥们理解的,一些注释和代码未做删减。