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等等)其中會
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
- private Serializable getReferencedSessionId(ServletRequest request, ServletResponse response) {
- String id = getSessionIdCookieValue(request, response);
- if (id != null) {
- request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,
- ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE);
- } else {
- //not in a cookie, or cookie is disabled - try the request URI as a fallback (i.e. due to URL rewriting):
- //try the URI path segment parameters first:
- id = getUriPathSegmentParamValue(request, ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
- if (id == null) {
- //not a URI path segment parameter, try the query parameters:
- String name = getSessionIdName();
- id = request.getParameter(name);
- if (id == null) {
- //try lowercase:
- id = request.getParameter(name.toLowerCase());
- }
- }
- if (id != null) {
- request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,
- ShiroHttpServletRequest.URL_SESSION_ID_SOURCE);
- }
- }
- public boolean isRequestedSessionIdFromURL() {
- if (isHttpSessions()) {
- return super.isRequestedSessionIdFromURL();
- } else {
- String value = (String) getAttribute(REFERENCED_SESSION_ID_SOURCE);
- return value != null && value.equals(URL_SESSION_ID_SOURCE);
- }
- }
我的辦法在每次跳轉之前就判斷sessionid是否有值。因為每次跳轉之前subject就已經建立了session。至於如果禁用cookies。同樣還是會在url上加上jsessionid。我們只是把判斷給至前了。並沒有修改原有邏輯。具體程式碼如下
[java] view plain copy
- /**
- * clear JSESSIONID in URL if session id is not null
- * {@link DefaultWebSessionManager} getReferencedSessionId
- * {@link ShiroHttpServletRequest} isRequestedSessionIdFromURL
- *
- * @author Infinite Justice
- */
- public class UserFilter extends AccessControlFilter{
- private Cookie sessionIdCookie;
- public Cookie getSessionIdCookie() {
- return sessionIdCookie;
- }
- public void setSessionIdCookie(Cookie sessionIdCookie) {
- this.sessionIdCookie = sessionIdCookie;
- }
- @Override
- protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
- if (isLoginRequest(request, response)) {
- return true;
- } else {
- Subject subject = getSubject(request, response);
- // If principal is not null, then the user is known and should be allowed access.
- return subject.getPrincipal() != null;
- }
- }
- @Override
- protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
- saveRequest(request);
- String sessionid = sessionIdCookie.readValue(WebUtils.toHttp(request), WebUtils.toHttp(response));
- // clear JSESSIONID in URL if session id is not null
- if(sessionid != null){
- request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE);
- request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sessionid);
- request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
- }
- redirectToLogin(request, response);
- return false;
- }
- }
- /**
- * clear JSESSIONID in URL if session id is not null
- * {@link DefaultWebSessionManager} getReferencedSessionId
- * {@link ShiroHttpServletRequest} isRequestedSessionIdFromURL
- *
- * @author Infinite Justice
- */
- public class LoginFilter extends FormAuthenticationFilter{
- private Cookie sessionIdCookie;
- public Cookie getSessionIdCookie() {
- return sessionIdCookie;
- }
- public void setSessionIdCookie(Cookie sessionIdCookie) {
- this.sessionIdCookie = sessionIdCookie;
- }
- @Override
- protected void setFailureAttribute(ServletRequest request, AuthenticationException ae) {
- request.setAttribute(getFailureKeyAttribute(), ae);
- }
- @Override
- protected void issueSuccessRedirect(ServletRequest request, ServletResponse response) throws Exception {
- String sessionid = sessionIdCookie.readValue(WebUtils.toHttp(request), WebUtils.toHttp(response));
- // clear JSESSIONID in URL if session id is not null
- if(sessionid != null){
- request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE);
- request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sessionid);
- request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
- }
- super.issueSuccessRedirect(request, response);
- }
- }
另一種解決辦法:
[java] view plain copy
- public class RedisWebSessionManager extends DefaultWebSessionManager {
- /**
- * Stores the Session's ID, usually as a Cookie, to associate with future requests.
- * @param session the session that was just{@link #createSession created}.
- */
-
相關推薦
Apache Shiro去掉URL中的JSESSIONID
使用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給去掉,然後點
【Shiro】Apache 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安全框架,提供了認證、授權、加密和會話管理等功能: 認證 - 用戶身份識別,常被稱為用戶“