当前位置: 首页 > news >正文

java session 修改_修改 Servlet 的sessionId

默认情况在Servlet的sessionId是通过浏览器的Cookie来得到了,现在想从http://localhost:8080/test?jsessionid=ffffxxxxwwwwwww这种方式来得到jsessionId如果url中有就以url中的jsessionId为主,如果没有则取Cookie中的JSESSIONID,但在Servlet中并没有直接可以重新设置JSESSIONID的地方,跟踪代码后发现在可以通过反射的方式来修改jsessionid,这里给出相关代码

import java.io.IOException;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.List;

import java.util.Objects;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.annotation.WebFilter;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletRequest;

import org.apache.catalina.servlet4preview.http.HttpServletRequestWrapper;

import org.springframework.util.ReflectionUtils;

import org.springframework.util.StringUtils;

@WebFilter(urlPatterns = "/*", filterName = "sessionFilter")

public class SessionFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

String jsessionid = request.getParameter("jsessionid");

if(!StringUtils.isEmpty(jsessionid)) {

Field field = ReflectionUtils.findField(request.getClass(), "request");

if(field != null) {

field.setAccessible(true);

Object tomcatReq = ReflectionUtils.getField(field, request);

field.setAccessible(false);

if(tomcatReq != null) {

Method setRequestedSessionId = ReflectionUtils.findMethod(tomcatReq.getClass(), "setRequestedSessionId", String.class);

if(setRequestedSessionId != null) {

ReflectionUtils.invokeMethod(setRequestedSessionId, tomcatReq, jsessionid);

}

}

}

}

HttpServletRequestWrapper req = new HttpServletRequestWrapper((HttpServletRequest) request) {

@Override

public Cookie[] getCookies() {

Cookie[] cookies = super.getCookies();

if(StringUtils.isEmpty(jsessionid) || Objects.isNull(cookies)) {

return cookies;

}

List newCookies = new ArrayList<>();

newCookies.add(new Cookie("JSESSIONID", jsessionid));

for (int i = 0; i< cookies.length; i++) {

Cookie cookie = cookies[i];

if(!"JSESSIONID".equalsIgnoreCase(cookie.getName())){

newCookies.add(cookie);

}

}

return newCookies.toArray(new Cookie[] {});

}

};

chain.doFilter(req, response);

}

@Override

public void destroy() {

}

}

相关文章:

  • qt添加qwt帮助文件_win 7下安装qwt 6.1.0,基于qt 4.8.5
  • java亮眼_一些java处理变量的 让我眼前一亮的
  • 36岁自学python_深入 Python 解释器源码,我终于搞明白了字符串驻留的原理!
  • idea 收费标准_2013年IDEA期限与费用
  • java反射机制学习_java学习之 反射机制
  • 怎样看java文件的编码方式_如何查看Java源文件的编码方式及去掉BOM
  • 蓝桥杯泊松分酒java_蓝桥杯编程大题-泊松分酒 | 学步园
  • java学生登陆界面代码_登录界面 - java代码库 - 云代码
  • java降序排序输出id和结果_Java报表软件--根据订单ID进行升序或降序排列
  • java虚拟机中xms_JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别
  • java 读取txt并分页_Ajax读取txt并对txt内容进行分页显示功能
  • java规范 文件行数_Java中文件中的行数
  • java中的build类_30 Java设计模式系列-建造者(Build)模式
  • java 高精度小数读入_java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定...
  • docker容器 mysql2意外停止_docker运行mysql容器自动停止的问题解救方案如下
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • PHP 7 修改了什么呢 -- 2
  • Python学习之路13-记分
  • Redis字符串类型内部编码剖析
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 第十八天-企业应用架构模式-基本模式
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 区块链共识机制优缺点对比都是什么
  • 深入浅出Node.js
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 数据可视化之 Sankey 桑基图的实现
  • 我看到的前端
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • C# - 为值类型重定义相等性
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #### go map 底层结构 ####
  • (2.2w字)前端单元测试之Jest详解篇
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • .net CHARTING图表控件下载地址
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .sh 的运行
  • /etc/motd and /etc/issue
  • @ComponentScan比较
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @RequestMapping-占位符映射
  • [ 数据结构 - C++] AVL树原理及实现
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [Avalon] Avalon中的Conditional Formatting.
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件
  • [HITCON 2017]SSRFme perl语言的 GET open file 造成rce
  • [JS真好玩] 掘金创作者必备: 监控每天是谁取关了你?
  • [Linux] Apache的配置与运用
  • [MySQL]基础的增删改查
  • [NOIP2003 普及组] 乒乓球(模拟)
  • [OpenAI]继ChatGPT后发布的Sora模型原理与体验通道