該圖java
當一個web 瀏覽器登陸到應用服務器時,應用服務器(application)會監測用戶的session,若是沒有session,則應用服務器會把url跳轉到CAS server上。要求web
用戶登陸,用戶登陸成功,CAS server會記住請求的application的url和該用戶的sessionId(在應用服務器跳轉到Url時,經過出參數傳給CAS server).此時在CAS服務器會種下TGC Cookie值到web browser ,擁有該TGC Cookie的web browser 能夠無需登陸進入全部創建sso服務的應用服務器application瀏覽器
第二張圖中,當一個web瀏覽器要求退出應用服務器,應用服務器application會把url跳轉到CAS server上的/cas/logout url資源上。服務器
CAS server接受到請求後,會檢測用戶的TGC cookie,把對應的session清除,同時會找到全部經過該TGC sso登陸的應用服務器URL提交請求,全部的回調請求中包含一個參數 logoutRequest。cookie
<samlp:LogoutRequest ID="[RANDOM ID]" Version="2.0" IssueInstant="[CURRENT DATE/TIME]"> <saml:NameID>@NOT_USED@</saml:NameID> <samlp:SessionIndex>[SESSION IDENTIFIER]</samlp:SessionIndex> </samlp:LogoutRequest>
全部收到請求的應用服務器application會解析這個參數,獲取sessionId,根據這個ID獲取session後,把session 刪除。這樣就實現了單點登出功能。session
首先,要實現single sign out,在應用服務器application端的web.xml要加入如下配置app
<filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener>
注意:若是有配置CAS client Filter,則CAS Signle Sign out Filter 必須放在CAS client Filter以前url
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException { // 轉換參數 final HttpServletRequest request = (HttpServletRequest) servletRequest; //判斷參數中是否具備artifactParameterName屬性指定的參數名稱,默認是ticket if (handler.isTokenRequest(request)) { // 若是存在,在本地sessionMappingStorage中記錄session。 handler.recordSession(request); } else if (handler.isLogoutRequest(request)) {//判斷是否具備logoutParameterName參數指定的參數,默認參數名稱爲logoutRequest // 若是存在,則在sessionMappingStorage中刪除記錄,並註銷session。 handler.destroySession(request); // 註銷session後,馬上中止執行後面的過濾器 return; } else { log.trace("Ignoring URI " + request.getRequestURI()); } //條件都不知足,繼續執行下面的過濾器 filterChain.doFilter(servletRequest, servletResponse); }
若是直接CAS的logout話,會出現註銷成功頁面,其實大部分狀況下這個頁面是沒有必要的,更多的須要多是退出後顯示登陸頁面,而且登陸成功後仍是會進入到以前的業務系統,那麼能夠修改cas-servlet.xml
在logoutController的bean配置中添加屬性"followServiceRedirects" 設置爲true,而後在業務系統的註銷鏈接中加入"service 參數",值爲業務系統的絕對URL。
如你的業務系統URL爲http://a:8080/login 那麼註銷URL就是 http://localhost:8080/cas/logout?service=http://a:8080/login