java 迅雷下载 session丢失_关于java并发场景下,HttpServletRequst中session丢失问题
使用场景:
在list数据进来之后使用安全数组 Lists.newCopyOnWriteArrayList()
进行了 parallelStream 并行处理,在接口中进行了登录者信息接口的调用,获取方式是从当前登录的requst中获取用户携带的session信息,在并行处理的过程中出现调用NPE异常信息。
问题排查:
public static ServletRequestAttributes getRequestAttributes() {
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
return (ServletRequestAttributes)attributes;
}
上述方法中 RequestContextHolder.getRequestAttributes(); 获取到的是NULL对象,来源于
@Nullable
public static RequestAttributes getRequestAttributes() {
RequestAttributes attributes = (RequestAttributes)requestAttributesHolder.get();
if (attributes == null) {
attributes = (RequestAttributes)inheritableRequestAttributesHolder.get();
}
return attributes;
}
上述方法中获取方式:
(RequestAttributes)requestAttributesHolder.get();或者
RequestAttributes)inheritableRequestAttributesHolder.get();
出现了null空值,原因是子线程获取了当前线程组中的参数为空:
private static final ThreadLocal requestAttributesHolder = new NamedThreadLocal("Request attributes");
private static final ThreadLocal inheritableRequestAttributesHolder = new NamedInheritableThreadLocal("Request context");
具体的实现是:
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
执行了最后的
setInitialValue();方法,此方法中返回了null;传递至其调用方法造成的NPE异常;
原因
主线程中request对象在创建子线程并行执行的时候没有将request对象共享给子线程,导致的null空指针,具体原因可参考request和response设置的底层实现;
解决办法
1.监听所有的请求,以监听器处理;初始化的时候添加请求监听器;
/**
* 监听器:监听HTTP请求事件
* 解决RequestContextHolder.getRequestAttributes()空指针问题
* @return
*/
@Bean
public RequestContextListener requestContextListener(){
return new RequestContextListener();
}
2.将当前线程的变量共享给子线程;并行请求开始的前先做变量共享。
ServletRequestAttributes servletRequst= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(servletRequst,true);
java 迅雷下载 session丢失_关于java并发场景下,HttpServletRequst中session丢失问题相关推荐
- java每秒向mysql写一条记录_【Java】mysql一条记录在高并发场景下读写?
CREATE TABLE `user_info` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `balance` decimal(10,2) DE ...
- 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目
王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...
- java 多态判断非空_收藏Java 面试题全梳理
脚本之家 你与百万开发者在一起 来源 | Java建设者(ID:javajianshe) 作者 |cxuan 如若转载请联系原公众号 Java 基础篇 Java 有哪些特点 并发性的:你可以在其中执行 ...
- java分布式库存系统_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...
前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...
- java currenttimemillis 效率_高并发场景下System.currentTimeMillis()的性能问题的优化
前言 System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我也不知道,不过听说在100倍左右),然而该方法又是一个常用方法,有时不得不使用,比如生 ...
- 读数据库遇到空就进行不下去_如何解决高并发场景下缓存+数据库双写不一致问题?...
推荐阅读: 一只Tom猫:手撕分布式技术:限流.通讯.缓存,全部一锅端走送给你!zhuanlan.zhihu.com 一只Tom猫:MySQL复习:20道常见面试题(含答案)+21条MySQL性能调 ...
- java web 开发之道_《Java Web开发之道》PDF 下载
图书目录: 第1篇 编程 经验与 感悟篇 第1章 编程 经验谈6则 经验01 乐不思蜀--寻找编程的乐趣 经验02 水滴石穿--编程学习 经验谈 经验03 举足轻重--代码规范 经验谈 经验 ...
- java 解析m3u8的实例_使用java线程池批量下载m3u8。合并mp4.
使用java线程池批量下载m3u8合并mp4. 看了线程池的demo,然后就想下载文件试试. 代码未必规范,多多建议. 大家可以自行修改,满足自己的需求. 还需要深入学习一下线程池. 给俺个星星⭐,可 ...
- java迅雷下载excel,Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...
(一) 如果在迅雷的下载对话框中点取消,则会使用IE的下载,这里的文件又是正确的了: 怀疑迅雷是根据下载对话框中的网址重新请求下载,与发起请求的页面已经无关,而IE又不会把ViewState信息传到迅 ...
- java迅雷下载excel,用servlet实现excel文件下载,用迅雷下载时文件名有关问题
用servlet实现excel文件下载,用迅雷下载时文件名问题 用servlet实现的excel下载,在用浏览器直接下载时,获得的文件名是设置在header中的文件名, 但如果用迅雷下载,生成的文件名 ...
最新文章
- 一份来自山东院校的考研调剂系统已开放名单!
- 自动驾驶中的3D物体状态检测
- 图像拼接--Construction and Refinement of Panoramic Mosaics with Global and Local Alignment
- apache2.0性能优化
- Flask + Nginx + React + Webpack 配置解决跨域问题
- python 爬取贝壳网小区名称_利用python爬取贝壳网租房信息
- PostgreSQL 与 MySQL 相比,优势何在?[转]
- linux 系统调用会被信号打断的
- mysql中括号_《MySQL数据库》SQL简介、语法格式
- iOS显示性能优化过程讲解
- Delphi7函数大全
- Java类的执行顺序
- 用PHP玩百万英雄类型游戏!!!
- iOS 人民币符号与日圆符号的混淆
- Android学习笔记27:网格视图GridView的使用
- error: possibly undefined macro: LT_SYS_SYMBOL_USCORE please use m4_pattern_allow
- Codeforces Round #573 (Div. 2)
- 雷达一维距离像怎么用matlab仿真出来,雷达目标识别之一维距离像的学习
- 使用Windows批处理+ImageMagick 实现批量处理图片
- 秀米中如何添加链接、文件链接、小程序链接?