shiro 攔截未登錄的ajax_Shiro是如何攔截未登錄請求的(二)

/**

* 重寫父類獲取sessionID的方法,若請求為APP或者H5則從請求頭中取出token,若為PC端后臺則從cookie中獲取

*

* @param request

* @param response

* @return

*/

@Override

protected Serializable getSessionId(ServletRequest request, ServletResponse response){

if (!(request instanceof HttpServletRequest)) {

logger.debug("Current request is not an HttpServletRequest - cannot get session ID. Returning null.");

return null;

}

HttpServletRequest httpRequest = WebUtils.toHttp(request);

if (StringHelpUtils.isNotBlank(httpRequest.getHeader("device"))

&& (httpRequest.getHeader("device").equals("APP") || httpRequest

.getHeader("device").equals("H5"))) {

//從header中獲取token

String token = httpRequest.getHeader(AUTH_TOKEN);

// 每次讀取之后都把當前的token放入response中

HttpServletResponse httpResponse = WebUtils.toHttp(response);

if (StringHelpUtils.isNotEmpty(token)) {

httpResponse.setHeader(AUTH_TOKEN, token);

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, "header");

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, token);

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);

}

//sessionIdUrlRewritingEnabled的配置為false,不會在url的后面帶上sessionID

request.setAttribute(ShiroHttpServletRequest.SESSION_ID_URL_REWRITING_ENABLED, isSessionIdUrlRewritingEnabled());

return token;

}

return getReferencedSessionId(request, response);

}

/**

* shiro默認從cookie中獲取sessionId

*

* @param request

* @param response

* @return

*/

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);

}

}

if (id != null) {

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);

//automatically mark it valid here. If it is invalid, the

//onUnknownSession method below will be invoked and we'll remove the attribute at that time.

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);

}

// always set rewrite flag - SHIRO-361

request.setAttribute(ShiroHttpServletRequest.SESSION_ID_URL_REWRITING_ENABLED, isSessionIdUrlRewritingEnabled());

return id;

}

//copy from DefaultWebSessionManager

private String getSessionIdCookieValue(ServletRequest request, ServletResponse response){

if (!isSessionIdCookieEnabled()) {

logger.debug("Session ID cookie is disabled - session id will not be acquired from a request cookie.");

return null;

}

if (!(request instanceof HttpServletRequest)) {

logger.debug("Current request is not an HttpServletRequest - cannot get session ID cookie. Returning null.");

return null;

}

HttpServletRequest httpRequest = (HttpServletRequest) request;

return getSessionIdCookie().readValue(httpRequest, WebUtils.toHttp(response));

}

//since 1.2.2 copy from DefaultWebSessionManager

private String getUriPathSegmentParamValue(ServletRequest servletRequest, String paramName){

if (!(servletRequest instanceof HttpServletRequest)) {

return null;

}

HttpServletRequest request = (HttpServletRequest) servletRequest;

String uri = request.getRequestURI();

if (uri == null) {

return null;

}

int queryStartIndex = uri.indexOf('?');

if (queryStartIndex >= 0) { //get rid of the query string

uri = uri.substring(0, queryStartIndex);

}

int index = uri.indexOf(';'); //now check for path segment parameters:

if (index < 0) {

//no path segment params - return:

return null;

}

//there are path segment params, let's get the last one that may exist:

final String TOKEN = paramName + "=";

uri = uri.substring(index + 1); //uri now contains only the path segment params

//we only care about the last JSESSIONID param:

index = uri.lastIndexOf(TOKEN);

if (index < 0) {

//no segment param:

return null;

}

uri = uri.substring(index + TOKEN.length());

index = uri.indexOf(';'); //strip off any remaining segment params:

if (index >= 0) {

uri = uri.substring(0, index);

}

return uri; //what remains is the value

}

//since 1.2.1 copy from DefaultWebSessionManager

private String getSessionIdName(){

String name = this.getSessionIdCookie() != null ? this.getSessionIdCookie().getName() : null;

if (name == null) {

name = ShiroHttpSession.DEFAULT_SESSION_ID_NAME;

}

return name;

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445892.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445892.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445892.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Clion和openssl動態庫實現服務器server和客戶端client之間的SSL通信

參考鏈接 使用Clion和gmssl動態庫實現服務器server和客戶端client之間的SSL通信_MY CUP OF TEA的博客-CSDN博客 服務端server CMakeLists.txt文件 cmake_minimum_required(VERSION 3.22)project(ssl_server) set(CMAKE_CXX_STANDARD 11)# 忽略警告 set(CMAKE_CXX_FLAGS &quo…

使用Clion和gmssl動態庫實現服務器server和客戶端client之間的SSL通信,測試指定密碼套件

參考鏈接 列出gmssl支持的國密算法TLS1.x密碼套件_liuqun69的博客-CSDN博客使用Clion和gmssl動態庫實現服務器server和客戶端client之間的SSL通信_MY CUP OF TEA的博客-CSDN博客 注意事項 GM/T 標準涵蓋 2 個協議&#xff1a;- SSL VPN 協議 (GM/T 0024-2014)- IPSec VPN 協議…

樣式緩存沒更新_差點沒認出來:Office 2019/365桌面新圖標來啦

微軟應該是從昨天晚上開始就向Microsoft Office 正式版通道推送新圖標(測試版早就推送了)&#xff0c;主要包括的是桌面文檔顯示圖標。目前微軟更新圖標的速度有些慢并且還有些混亂&#xff0c;因為這些圖標并不是同時更新的而存在分批分次推送情況。如下圖多數組件已經可以看到…

在Ubuntu上安裝Git

安裝步驟 首先&#xff0c;確認系統是否已安裝git&#xff0c;可以通過git指令進行查看&#xff0c;如果沒有&#xff0c;則輸入sudo apt-get install git命令進行安裝。 安全配置 安裝完成后進行git配置&#xff0c;輸入指令git config --global user.name "xxx"…

10kv線路負載率計算_電工必懂計算公式,你若不會,如何立足于電力行業?

一電力變壓器額定視在功率Sn200KVA&#xff0c;空載損耗Po0.4KW&#xff0c;額定電流時的短路損耗PK2.2KW,測得該變壓器輸出有功功率P2&#xff1d;140KW時&#xff0c;二次則功率因數20.8。求變壓器此時的負載率b 和工作效率。解&#xff1a;因P2bSn2100%bP2(Sn2)100%140(2000…

在基于 Ubuntu 的 Linux 發行版上安裝 Wireshark

參考鏈接 Ubuntu 上 Wireshark 的安裝與使用 - 知乎https://www.myfreax.com/how-to-add-apt-repository-in-ubuntu/ 前情提要 使用Ubuntu軟件中心或命令行apt或apt-get安裝軟件包時&#xff0c;這些軟件包是從一個或多個apt軟件存儲庫中下載的。 APT存儲庫是一個網絡服務器或…

使用wireshark抓包,驗證客戶端和服務端SSL通信時指定的算法套件

前情提要 使用Clion和gmssl動態庫實現服務器server和客戶端client之間的SSL通信&#xff0c;測試指定密碼套件_MY CUP OF TEA的博客-CSDN博客在基于 Ubuntu 的 Linux 發行版上安裝 Wireshark_MY CUP OF TEA的博客-CSDN博客本地搭建server和客戶端使用端口進行數據通信&#xf…

r語言隨機森林回歸預測_從零實現回歸隨機森林

一、前言回歸隨機森林作為一種機器學習和數據分析領域常用且有效的算法&#xff0c;對其原理和代碼實現過程的掌握是非常有必要的。為此&#xff0c;本文將著重介紹從零開始實現回歸隨機森林的過程&#xff0c;對于隨機森林和決策樹的相關理論原理將不做太深入的描述。本文的目…

openssl編程-基礎知識-回調函數

參考內容 OpenSSL編程 趙春平 回調函數 回調函數就是一個通過函數指針調用的函數。如果你把函數的指針&#xff08;地址&#xff09;作為參數傳遞給另一個函數&#xff0c;當這個指針被用來調用其所指向的函數時&#xff0c;我們就說這是回調函數把一段可執行的代碼像參數傳遞…

hive插件 ranger_Apache Ranger及Hive權限控制

一、Ranger概述1.Ranger簡介Apache Ranger提供一個集中式安全管理框架, 并解決授權和審計。它可以對Hadoop生態的組件如HDFS、Yarn、Hive、Hbase等進行細粒度的數據訪問控制。通過操作Ranger控制臺,管理員可以輕松的通過配置策略來控制用戶訪問權限。本文章介紹Ranger與Hive集成…

openssl編程-基礎知識-OpenSSL簡介

參考鏈接 在ubuntu環境下執行openssl編譯和安裝_MY CUP OF TEA的博客-CSDN博客_openssl ubuntuOpenSSL編程 趙春平 OpenSSL 簡介 它提供的主要功能有&#xff1a;SSL協議實現(包括SSLv2、SSLv3和TLSv1)、大量軟算法(對稱/非對稱/摘要)、大數運算、非對稱算法密鑰生成、ASN.1編…

linux修改文件句柄數生效_linux系統層面調優和常見的面試題

linux系統層面調優和常見的面試題?mp.weixin.qq.com無論對Spark集群&#xff0c;還是Hadoop集群等大數據相關的集群進行調優&#xff0c;對linux系統層面的調優都是必不可少的&#xff0c;這里主要介紹3種常用的調優&#xff1a;1.linux文件句柄linux在整個系統層面和單個進程…

openssl編程-基礎知識-OpenSSL堆棧

堆棧介紹 堆棧是一種先進后出的數據結構openssl 大量采用堆棧來存放數據。它實現了一 個通用的堆棧&#xff0c;可以方便的存儲任意數據它實現了許多基本的堆棧操作&#xff0c;主要有&#xff1a;堆棧拷貝(sk_dup)、構建新堆棧&#xff08;sk_new_null&#xff0c;sk_new&…

小米用戶畫像_企鵝智庫:高學歷用蘋果中老年用華為 男性用小米女性用OV

不同手機品牌都有著自己不同的定位人群&#xff0c;在國內市場目前幾大非常有名的手機品牌分別被三星、蘋果、華為、小米、OV占據&#xff0c;而這些手機品牌的主要購買人群到底是什么樣的呢&#xff1f;企鵝智庫近日發布了一份手機消費者的調研報告&#xff0c;并且根據消費者…

國密gmtls協議-雙證書體系的服務端和客戶端通信代碼

內容介紹 國密的雙證書體系&#xff0c;將證書按照使用目的的不同劃分為加密證書和簽名證書兩種&#xff0c;也就是兩對公私鑰&#xff0c;二者本質一致&#xff0c;均為SM2密鑰對&#xff0c;區別僅體現在用法國密CA體系中&#xff0c;加密密鑰對由CA產生&#xff0c;簽名密鑰…

jwt 私鑰_什么是 JSON Web Token(JWT)

有關本文檔的快速鏈接&#xff0c;請參考頁面提示。什么是 JSON Web Token(JWT)?JSON Web Token (JWT) 作為一個開放的標準 (RFC 7519) 定義了一種簡潔自包含的方法用于通信雙方之間以 JSON 對象的形式安全的傳遞信息。因為有數字簽名&#xff0c;所以這些通信的信息能夠被校驗…

server和client之間進行Socket通信,進行數據切片

參考鏈接 send函數和recv函數 – gudakos memo 注意事項 代碼很low&#xff0c;主要看封裝的Send函數所體現的切片思想即可 server代碼 //udp服務端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include …

天線下傾角示意圖_常用天線和無源器件技術參數匯總

原標題&#xff1a;常用天線和無源器件技術參數匯總一、天線原理天線的定義&#xff1a; 能夠有效地向空間某特定方向輻射電磁波或能夠有效的接收空間某特定方向來的電磁波的裝置。天線的功能&#xff1a; 能量轉換-導行波和自由空間波的轉換; 定向輻射(接收)-具有一定的方向性…

制作作品圖片_不懂人文后期制作流程?來,大師手把手教你

制作前1、處理一張照片思路決定步驟 想要了解學習的老師可以私聊小編fzhdyx222制作后2、2020年最新Camera Raw局部影調和色調的控制想要了解學習的老師可以私聊小編fzhdyx222制作前3、2020年最新Camera Raw基礎工具細節性運用想要了解學習的老師可以私聊小編fzhdyx222制作后4、…

xlsx文件打開亂碼_Excel 2016 雙擊無法打開xlsx文件怎么辦?

最近我重裝了系統(Win10Office2016)&#xff0c;然后發現了一個奇怪的bug&#xff1a;雙擊xlsx文件&#xff0c;只能打開Excel窗口&#xff0c;但是打不開這個文件&#xff0c;有時候再次雙擊就能打開了&#xff0c;但有時再次雙擊也不管用&#xff0c;需要在Excel的菜單中點“…