版本: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是被主动干掉的,并不是超时。
-------------------------------------
------------------------------------
现象:
登录成功后,马上点退出。
退出登录后,自动跳转到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是被主动干掉的,并不是超时。
-------------------------------------