事情是这样的,cas服务端集成了不同的客户端,现在A客户端在登录后,登出时,cas服务端日志如下:
其中TGT-84是一次正常的登录,登出。
我们要关注的是TGT-85的,首先红框内的打印,记录了正常的登录,然后客户端A登出后,再次登录,下面就报ERROR
分析可得,是CentralAuthenticationServiceImpl.class里对serviceTicket和service做校验时不通过。对比报错就是serviceTicket是以Action结尾的,而客户端的请求service在Action后跟了JSESSIONID串。找到问题所在,就继续分析。
以下内容摘自网络
浏览器访问带 ?service=*** 的单点登录地址来请求登录页,在返回的Response Headers中有参数Set-Cookie,在本地cookie中设置了CASTGC,设置了cookie的有效时间。
问题就出在了这个地方,如果浏览器本地禁止了写cookie操作,那么set-cookie并不会成功;那么会话的jsessionid信息会通过url重写的方式,传送到CAS 服务端,来保持通话。
客户端禁用cookie的情况下重写URL。重写URL是用分号将jsessionid紧跟在请求地址之后,在访问参数之前的动作。
在客户端的web.xml里面添加如下配置:其中session-timeout用来设置超时时间,单位:分。
<session-config> <session-timeout>30</session-timeout> <tracking-mode>COOKIE</tracking-mode> </session-config>
重启后,再次操作:发现JSESSIONID已经被写入Cookie
问题解决。