日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 单点登出_CAS单点登出的原理

發布時間:2024/1/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 单点登出_CAS单点登出的原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【出版社直供】操作系統精髓與第九版

91.6元

包郵

(需用券)

去購買 >

單點登出功能跟單點登錄功能是相對應的,旨在通過Cas Server的登出使所有的Cas Client都登出。

Cas Server的登出是通過請求“/logout”發生的,即如果你的Cas Server部署的訪問路徑為“https://localhost:8443/cas”時,

通過訪問“https://localhost:8443/cas/logout”可以觸發Cas Server的登出操作,進而觸發Cas Client的登出。

在請求Cas Server的logout時,Cas Server會將客戶端攜帶的TGC刪除,同時回調該TGT對應的所有service,即所有的Cas Client。

Cas Client如果需要響應該回調,進而在Cas Client端進行登出操作的話就需要有對應的支持。

具體來說,需要在Cas Client應用的web.xml文件中添加如下Filter和Listener。

CAS Single Sign Out Filter

org.jasig.cas.client.session.SingleSignOutFilter

CAS Single Sign Out Filter

/*

org.jasig.cas.client.session.SingleSignOutHttpSessionListener

我們分別看一下這兩個類的源碼:

public voiddoFilter(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);

}

用戶通過瀏覽器訪問系統A?www.a.com/pageA,這個?pageA?是個需要登錄才能訪問的頁面,系統A發現用戶沒有登錄,這時候系統A需要做一個額外的操作,就是重定向到認證中心:?www.sso.com/login?service=www.a.com/pageA。

這個?service?參數是一個回跳的url,認證完成后會重定向到系統A,另外有一個作用就是注冊服務,簡單來說注冊服務為的是讓我們的認證中心能夠知道有哪些系統在我們這里完成過登錄,其中一個重要目的是為了完成單點退出的功能。

注冊服務時保存一是回跳的service地址,二是對應的ticket。

拿著ticket回跳到客戶端后,客戶端一看地址的請求參數有ticket的時候,singleSignOutFilter注冊帶有ticket作為id的session到sessionMappingStorage。

當用戶訪問認證中心的/logout?需要退出的時候,認證中心先把TGT干掉,然后給之前注冊過那些服務的地址發送退出登錄的請求,并且攜帶之前登錄的ticket,客戶端一看請求中參數有logoutRequest的時候,

客戶端的singleSignOutFilter根據傳過來的這個?ticket?來將對應的用戶?session?干掉即可。

那么什么時候干掉sessionMappingStorage呢?(sessionMappingStorage是一個map,key為ticket,value為session)

這是靠SingleSignOutHttpSessionListener來實現的,當有session被注銷的時候,觸發將sessionMappingStorage中對應的sessionId中的數據刪除,

所以在配置單點登出的時候,一定要配置這個監聽器,否則客戶端很容易導致內存溢出。

SingleSignOutHttpSessionListener 源碼:

/**

* Listener to detect when an HTTP session is destroyed and remove it from the map of

* managed sessions. Also allows for the programmatic removal of sessions.

*

* Enables the CAS Single Sign out feature.

*

* Scott Battaglia

* @version $Revision$ Date$

* @since 3.1*/

public final classSingleSignOutHttpSessionListener implements HttpSessionListener {privateSessionMappingStorage sessionMappingStorage;public void sessionCreated(final HttpSessionEvent event) {//nothing to do at the moment

}public void sessionDestroyed(final HttpSessionEvent event) {if (sessionMappingStorage == null) {

sessionMappingStorage=getSessionMappingStorage();

}

final HttpSession session= event.getSession();

sessionMappingStorage.removeBySessionById(session.getId());

}/**

* Obtains a {@link SessionMappingStorage} object. Assumes this method will always return the same

* instance of the object. It assumes this because it generally lazily calls the method.

*

* @return the SessionMappingStorage*/

protected staticSessionMappingStorage getSessionMappingStorage() {returnSingleSignOutFilter.getSingleSignOutHandler().getSessionMappingStorage();

}

}

原文鏈接:https://www.cnblogs.com/xiangkejin/p/8963089.html

java 11官方入門(第8版)教材

79.84元

包郵

(需用券)

去購買 >

總結

以上是生活随笔為你收集整理的java 单点登出_CAS单点登出的原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。