国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
shiro集成CAS實現(xiàn)單點登出

使用shiro集成CAS實現(xiàn)單點登錄的文章有很多,配置大同小異。與之對應的單點登出可能大家關注的不夠。
單點登出,表示瀏覽器同時訪問了多個接入單點登錄系統(tǒng),在某個系統(tǒng)點擊退出的同時,其他系統(tǒng)也應該同時登出。進一步提升了系統(tǒng)的安全性。
CAS,提供了很好的單點登出實現(xiàn),用戶只需要簡單配置對應的監(jiān)聽器和過濾即可。原理也很簡單,網上有很多說明。

<!-- 單點登出監(jiān)聽器 -->    <listener>        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>    </listener>    <!-- 單點登出 -->    <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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

線上會遇到一個問題:用戶登錄后權限信息發(fā)生變化。shiro默認會將用戶權限信息、系統(tǒng)權限信息進行緩存,一定程度上提升系統(tǒng)的響應。使用默認單點退出,并不會將用戶緩存信息進行情況。
基于這個問題,對SingleSignOutFilter進行一定改造:

public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {        final HttpServletRequest request = (HttpServletRequest) servletRequest;        if (handler.isTokenRequest(request)) {            handler.recordSession(request);        } else if (handler.isLogoutRequest(request)) {            handler.destroySession(request);            // Do not continue up filter chain            return;        } else {            log.trace("Ignoring URI " + request.getRequestURI());        }        filterChain.doFilter(servletRequest, servletResponse);    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

解讀源碼,handler.destroySession(request),

public void destroySession(final HttpServletRequest request) {        final String logoutMessage = CommonUtils.safeGetParameter(request, this.logoutParameterName);        if (log.isTraceEnabled()) {            log.trace ("Logout request:\n" + logoutMessage);        }        final String token = XmlUtils.getTextForElement(logoutMessage, "SessionIndex");        if (CommonUtils.isNotBlank(token)) {            final HttpSession session = this.sessionMappingStorage.removeSessionByMappingId(token);            if (session != null) {                String sessionID = session.getId();                if (log.isDebugEnabled()) {                    log.debug ("Invalidating session [" + sessionID + "] for token [" + token + "]");                }                try {                    session.invalidate();                } catch (final IllegalStateException e) {                    log.debug("Error invalidating session.", e);                }            }        }    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

代碼會解析,獲取當前登錄用戶的session,有了session,我們就可以得到shiro中的Subject對象了,就能調用subject.logout()方法,清除緩存了。當用戶退出重新登錄系統(tǒng),新的權限信息立馬生

if (handler.isTokenRequest(request)) {            handler.recordSession(request);        } else if (handler.isLogoutRequest(request)) {            HttpSession session = handler.getSession(request);            log.info("single sign out request,SesionID[" +session.getId()+"]");            if(session != null){                new WebSubject.Builder(getSecurityManager(), request, response).session(new HttpServletSession(session,"")).buildSubject().logout();                log.info("single sign out request,SesionID[" +session.getId()+"]"+",shiro subject logout success!");            }            handler.destroySession(session);            log.info("single sign out request,SesionID[" +session.getId()+"]"+",destroy session success!");            // Do not continue up filter chain            return;        } else {            log.trace("Ignoring URI " + request.getRequestURI());        }        filterChain.doFilter(servletRequest, servletResponse);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

重寫了SingleSignOutHandler類,首先獲取session,然后通過new WebSubject。親測有效。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Shiro框架Web環(huán)境下過濾器結構分析
理解這9大內置過濾器,才算是精通Shiro
SpringBoot+Shiro學習之自定義攔截器管理在線用戶(踢出用戶) | z77z的小碼窩 | 年少無為,賣碼為生。
spring mvc下shiro的session,request等問題
CAS干單點登陸(SSO)
使用Filter對用戶權限和session的控制
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服