事情是這樣的,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
問題解決。