版本:Server 3.5.2 ------------------------------------ 现象:
登录成功后,马上点退出。
退出登录后,自动跳转到login页面,
慢一点,等个几秒钟,然后输入用户名,密码,提交
页面刷新了一下,仍然是login页面,
再次输入,正常进入。
[已证实,原始的cas的war包部署上,也有此问题] ------------------------------------ 抓包,
HTTP/1.1 302 Moved Temporarily Server: Apache-Coyote/1.1 Pragma: no-cache Expires: Thu, 01 Jan 1970 00:00:00 GMT Cache-Control: no-cache Cache-Control: no-store Set-Cookie: JSESSIONID=3911117B64346B50E24F36632C2419D7; Path=/cas Location: http://10.0.103.137:8080/cas/login Content-Length: 0 Date: Wed, 30 Oct 2013 03:37:07 GMT
发现重新设置了SessionID,正常登录时则不会设置。
怀疑是Session不存在了,导致后台重新创建Session,重新返回了login页面。 ------------------------------------ 一顿乱搜,搜到了几个文章,说到类似的现象:
http://jasig.275507.n4.nabble.com/Login-post-renew-true-when-does-it-get-302-vs-200-td2340424.html
https://groups.google.com/forum/#!topic/jasig-cas-user/Ba7el3kU8qQ
https://groups.google.com/forum/#!topic/jasig-cas-user/_GU2CW4LU0U ------------------------------------ 找到org.jasig.cas.web.flow下的TerminateWebSessionListener.java, 这个类监听sessionStarted和sessionEnded事件,
加log后执行,
发现,访问login页面时是session start,登录成功后是session end,
也就是说,登录动作执行后这个session就被咔嚓掉了~~~
喀嚓掉,是使用 webSession.setMaxInactiveInterval(this.timeToDieInSeconds);实现的。
默认值是2,也就是两秒 private int timeToDieInSeconds = 2; ------------------------------------ 执行logout时,只是让TGC无效,并没有重新创建Session。
(注意,前提是,登录成功后马上点退出。 如果等一会再点,会重新创建Session的,就无问题了)
所以,logout后自动跳转到login时,
浏览器带的JSessionID还是之前的那个,也就是打算被咔嚓的那个。
提交表单后,由于timeToDieInSeconds默认是两秒,手速慢一点,这个Session就已经不在了,所以重新创建Session,login页面刷新了。 -------------------------------------- 配置timeToDieInSeconds这个值,可以在cas-servlet.xml
<bean id="terminateWebSessionListener" class="org.jasig.cas.web.flow.TerminateWebSessionListener" p:serviceManagerUrl="${cas.securityContext.serviceProperties.service}" p:timeToDieInSeconds="60"/>
设置 p:timeToDieInSeconds="60"这样既可,默认是没有这个参数的。
改成60秒后,试验,退出跳转到login页面,等几十秒再提交也正常登录了。
干脆改成1800秒,也就是30分钟,哦了~~ ------------------------------------- 在web.xml中有个 <session-config> <!-- Default to 5 minute session timeouts --> <session-timeout>5</session-timeout> </session-config> Session超时时间是5分钟~~
不过,该处设置对本问题没有用,因为登录后Session是被主动干掉的,并不是超时。 -------------------------------------
|