1. 程式人生 > >Apache Shiro去掉URL中的JSESSIONID

Apache Shiro去掉URL中的JSESSIONID

使用shiro過程中,有時url會遇到JSESSIONID這個小尾巴,去掉小尾巴的解決方法:

1、其實shiro在1.3.2版本已經解決了這個問題,只需配置一下引數即可。

!-- 會話管理配置 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> 
        <!-- 會話超時時間,單位:毫秒  20m=1200000ms, 30m=1800000ms, 60m=3600000ms-->
        <property name
="globalSessionTimeout" value="1800000"/>
<property name="sessionValidationInterval" value="1200000"/> <!-- 去掉 JSESSIONID --> <property name="sessionIdUrlRewritingEnabled" value="false" /> <property name="sessionValidationSchedulerEnabled" value="true"/> <property
name="sessionDAO" ref="sessionDAO"/>
<property name="sessionIdCookie" ref="sessionIdCookie"/> <property name="sessionIdCookieEnabled" value="true"/> </bean>


2、低於1.3.2版本處理方法:(原理)在我們點選登陸之後會訪問DefaultSecurityManager構建Subject。建立Subject之前會做很多事(建立cookie和session等等)其中會

訪問一下DefaultWebSessionManager的getReferencedSessionId方法。方法裡面判斷cookie裡面是否有sessionid。肯定是沒有的啦所以不會向request裡面存放ShiroHttpServletRequest的3個靜態屬性。然後在org.apache.shiro.web.filter.authc.FormAuthenticationFilter登陸成功跳轉頁面的時候。issueSuccessRedirect方法裡面會判斷request是否有ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE如果有直接跳轉到成功頁面。具體判斷的程式碼在ShiroHttpServletRequest裡面的isRequestedSessionIdFromURL方法上。如果沒有會在跳轉成功頁面url後面加上JSESSIONID。所以url上就多出了JSESSIONID.然後跳轉首頁時又會訪問DefaultSecurityManager構建Subject。同樣會進DefaultWebSessionManager的getReferencedSessionId方法這個時候sessionid有值所以request裡面存放了

ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE。這就是為什麼我們刪掉JSESSIONID他又不加上的原因。因為你後面每次訪問。構建subject的時候sessionid有值request的裡面也有值他就不會在url上加JSESSIONID了啊。假設我們刪除瀏覽器cookie這個時候沒有了sessionid。我們訪問當前地址。同樣會建立Subject。由於sessionid沒有了所以request裡面就不會存值了。然後會進入org.apache.shiro.web.filter.authc.UserFilter判斷subject是否有認證資訊。沒有會通過saveRequestAndRedirectToLogin跳轉到登陸頁面。saveRequestAndRedirectToLogin裡面判斷request是否有值沒值又會在跳轉頁面的url上加上JSESSIONID。然後進入登陸介面的時候構建subject 建立session request裡面存值。好了說完了。看不懂得自己腦補把。

[java]  view plain  copy
  1. private Serializable getReferencedSessionId(ServletRequest request, ServletResponse response) {  
  2.   
  3.         String id = getSessionIdCookieValue(request, response);  
  4.         if (id != null) {  
  5.             request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,  
  6.                     ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE);  
  7.         } else {  
  8.             //not in a cookie, or cookie is disabled - try the request URI as a fallback (i.e. due to URL rewriting):  
  9.   
  10.             //try the URI path segment parameters first:  
  11.             id = getUriPathSegmentParamValue(request, ShiroHttpSession.DEFAULT_SESSION_ID_NAME);  
  12.   
  13.             if (id == null) {  
  14.                 //not a URI path segment parameter, try the query parameters:  
  15.                 String name = getSessionIdName();  
  16.                 id = request.getParameter(name);  
  17.                 if (id == null) {  
  18.                     //try lowercase:  
  19.                     id = request.getParameter(name.toLowerCase());  
  20.                 }  
  21.             }  
  22.             if (id != null) {  
  23.                 request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,  
  24.                         ShiroHttpServletRequest.URL_SESSION_ID_SOURCE);  
  25.             }  
  26.         }  
  27.         


[java]  view plain  copy
  1. public boolean isRequestedSessionIdFromURL() {  
  2.        if (isHttpSessions()) {  
  3.            return super.isRequestedSessionIdFromURL();  
  4.        } else {  
  5.            String value = (String) getAttribute(REFERENCED_SESSION_ID_SOURCE);  
  6.            return value != null && value.equals(URL_SESSION_ID_SOURCE);  
  7.        }  
  8.    }  

我的辦法在每次跳轉之前就判斷sessionid是否有值。因為每次跳轉之前subject就已經建立了session。至於如果禁用cookies。同樣還是會在url上加上jsessionid。我們只是把判斷給至前了。並沒有修改原有邏輯。具體程式碼如下

[java]  view plain  copy
  1. /** 
  2.  * clear JSESSIONID in URL if session id is not null  
  3.  * {@link DefaultWebSessionManager} getReferencedSessionId 
  4.  * {@link ShiroHttpServletRequest} isRequestedSessionIdFromURL 
  5.  *  
  6.  * @author Infinite Justice 
  7.  */  
  8. public class UserFilter extends AccessControlFilter{  
  9.       
  10.     private Cookie sessionIdCookie;  
  11.       
  12.     public Cookie getSessionIdCookie() {  
  13.         return sessionIdCookie;  
  14.     }  
  15.   
  16.   
  17.     public void setSessionIdCookie(Cookie sessionIdCookie) {  
  18.         this.sessionIdCookie = sessionIdCookie;  
  19.     }  
  20.       
  21.     @Override  
  22.     protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {  
  23.         if (isLoginRequest(request, response)) {  
  24.             return true;  
  25.         } else {  
  26.             Subject subject = getSubject(request, response);  
  27.             // If principal is not null, then the user is known and should be allowed access.  
  28.             return subject.getPrincipal() != null;  
  29.         }  
  30.     }  
  31.       
  32.     @Override  
  33.     protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {  
  34.         saveRequest(request);  
  35.         String sessionid = sessionIdCookie.readValue(WebUtils.toHttp(request), WebUtils.toHttp(response));  
  36.         // clear JSESSIONID in URL if session id is not null   
  37.         if(sessionid != null){  
  38.             request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE);  
  39.             request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sessionid);  
  40.             request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);  
  41.         }  
  42.         redirectToLogin(request, response);  
  43.         return false;  
  44.     }  
  45. }  


[java]  view plain  copy
  1. /** 
  2.  * clear JSESSIONID in URL if session id is not null  
  3.  * {@link DefaultWebSessionManager} getReferencedSessionId 
  4.  * {@link ShiroHttpServletRequest} isRequestedSessionIdFromURL 
  5.  *  
  6.  * @author Infinite Justice 
  7.  */  
  8. public class LoginFilter extends FormAuthenticationFilter{  
  9.       
  10.     private Cookie sessionIdCookie;  
  11.       
  12.     public Cookie getSessionIdCookie() {  
  13.         return sessionIdCookie;  
  14.     }  
  15.   
  16.   
  17.     public void setSessionIdCookie(Cookie sessionIdCookie) {  
  18.         this.sessionIdCookie = sessionIdCookie;  
  19.     }  
  20.   
  21.   
  22.     @Override  
  23.     protected void setFailureAttribute(ServletRequest request, AuthenticationException ae) {  
  24.         request.setAttribute(getFailureKeyAttribute(), ae);  
  25.     }  
  26.       
  27.     @Override  
  28.     protected void issueSuccessRedirect(ServletRequest request, ServletResponse response) throws Exception {  
  29.         String sessionid = sessionIdCookie.readValue(WebUtils.toHttp(request), WebUtils.toHttp(response));  
  30.         // clear JSESSIONID in URL if session id is not null   
  31.         if(sessionid != null){  
  32.             request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE);  
  33.             request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sessionid);  
  34.             request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);  
  35.         }  
  36.         super.issueSuccessRedirect(request, response);  
  37.     }  
  38. }  

另一種解決辦法:

[java]  view plain  copy
  1. public class RedisWebSessionManager extends DefaultWebSessionManager {  
  2.   
  3.     /** 
  4.      * Stores the Session's ID, usually as a Cookie, to associate with future requests. 
  5.      * @param session the session that was just{@link #createSession created}. 
  6.      */  
  7.     

    相關推薦

    Apache Shiro去掉URLJSESSIONID

    使用shiro過程中,有時url會遇到JSESSIONID這個小尾巴,去掉小尾巴的解決方法: 1、其實shiro在1.3.2版本已經解決了這個問題,只需配置一下引數即可。 !-- 會話管理配置 --> <bean id="sessionManager" class="

    VUE專案問題之:去掉url的#/

    一、問題 使用VUE路由,專案的url總是帶有錨點,如下: http://localhost:8082/#/ 二、解決 修改路由檔案中 index.js 檔案,即 src --> router --> index.js 沒修改前: export defau

    nginx反向代理和rewrite進行解決跨域問題 去掉url的一部分字串,通過nginx正則生成新的url

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    nginx 配置去掉URL工程名

    server { listen 80; server_name www.abc.com; location / { prox

    修改tomcat配置對映去掉URL的專案名

    conf/server.xml:      <Host name="localhost"  appBase="webapps"            unpackWARs="true" autoDeploy="true"            xmlValidation

    nginx反向代理和rewrite進行解決跨域問題、去掉url的一部分字串,通過nginx正則生成新的url

    場景:表面上訪問的是http://127.0.0.1:7777/test/xhtml//tpl/app-tpl-webapp/css/base.css,實際上看的是http://127.0.0.1:8888/tpl/app-tpl-webapp/css/base.css的內容

    nginx去掉url的index.php

    使用情境:我想輸入www.abc.com/a/1後,實際上是跳轉到www.abc.com/index.php/a/1 配置Nginx.conf在你的虛擬主機下新增: location / {    

    CI在nginx環境下去掉url的index.php

    在nginx環境下CI框架預設URL規則訪問不了,出現500錯誤,如: http://blog.php230.com/index.php/keywords 今天在伺服器配置CI框架環境時,去除URL中的index.php,出現了預設URL規則訪問不了的情況,只能通過引數方

    Angular 去掉url的#號,並解決頁面重新整理404問題

    1. 為什麼要去除?Angular官方指出:如果沒有足夠使用hash風格(#)的理由,還是儘量使用HTML5模式的路由風格;如果配置了hash風格,在微信支付或是Angular的深路徑依然會出404的問題;當你需要使用GA等工具時,由於無法獲取#號後的URL,導致每次路由切換

    項目一:第十二天 1、常見權限控制方式 2、基於shiro提供url攔截方式驗證權限 3、在realm授權 5、總結驗證權限方式(四種) 6、用戶註銷7、基於treegrid實現菜單展示

    eal 重復數 規則 認證通過 delete get 數據庫 filter 登陸 1 課程計劃 1、 常見權限控制方式 2、 基於shiro提供url攔截方式驗證權限 3、 在realm中授權 4、 基於shiro提供註解方式驗證權限 5、 總結驗證權限方式(四種) 6、

    在Spring MVC使用Apache Shiro安全框架

    修改 ctype var format href 文件的 來看 one name 我們在這裏將對一個集成了Spring MVC+Hibernate+Apache Shiro的項目進行了一個簡單說明。這個項目將展示如何在Spring MVC 中使用Apache Shiro來構

    web開發安全框架Apache Shiro的應用

    web開發安全框架中的Apache Shiro的應用 前階段就hadoop的分享了一些內容,希望對新手入門的朋友有點幫助吧!對於hadoop新手入門的,還是比較推薦大快搜索的DKHadoop發行版,三節點標準版還是值得擁有的(三節點的標準版是可以免費下載的,與付費版的目前功能一樣,只是節點數

    去掉CodeIgniter(CI)預設url的index.php

    去掉CodeIgniter(CI)預設url中的index.php //1.開啟apache的配置檔案,conf/httpd.conf :LoadModule rewrite_module modules/mod_rewrite.so //把該行前的#去掉。 //搜尋 AllowOv

    修改apache配置檔案去除thinkphp url的index.php

    例如你的原路徑是 http://localhost/test/index.php/index/add 那麼現在的地址是 http://localhost/test/index/add 如何去掉index.php呢? 1、httpd.conf配置檔案中載入了mod_rewrite.so模組&n

    訪問url的專案名是怎麼去掉的?

    如: 我這裡是這樣的,http://localhost:8080/seckill/seckill/list,多了一個專案名seckill 最佳答案 郵件專案名 -> Properties -> MyEcelipse -> Web -> Web

    去掉wordpress url的/wordpress

    背景:在安裝完wordpress後我們會使用:http://ip/wordpress來登入,但是我們如果想直接用ip登入,不需要顯示/wordpress字尾呢?其實是可以實現的。 方法: 1、先登入wp-admin,在設定-常規裡,將站點地址URL後面的/wordpress給去掉,然後點

    ShiroApache Shiro架構之實際運用(整合到Spring)

    寫在前面:前面陸陸續續對Shiro的使用做了一些總結,如題,這篇博文主要是總結一下如何將Shiro運用到實際專案中,也就是將Shiro整到Spring中進行開發。後來想想既然要整,就索性把

    在 Web 專案應用 Apache Shiro

    使用者許可權模型 在揭開 Shiro 面紗之前,我們需要認知使用者許可權模型。本文所提到使用者許可權模型,指的是用來表達使用者

    如何去掉word的回車符??

    src play .com auto display 替換 com 符號 ges 打開word界面,點擊頁面左上角的“文件”按鈕,進入到文件欄目中,進行設置。 進入文件之後,在左下角找到並點擊“選項”,進入到word的設置界面中 進入到word選項之後,在左方的菜

    Apache Shiro 使用手冊(一)Shiro架構介紹

    springmvc+mybatis dubbo+zookeeper restful redis分布式緩存 shiro kafka 一、什麽是Shiro Apache Shiro是一個強大易用的Java安全框架,提供了認證、授權、加密和會話管理等功能: 認證 - 用戶身份識別,常被稱為用戶“