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.mzph.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的菜单中点“…