惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
腾讯CDC
D
Docker
G
Google Developers Blog
D
DataBreaches.Net
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
The Cloudflare Blog
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
量子位
美团技术团队
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 何锦彬

没开电脑! 只用手机和QQ聊天, 让openClaw帮我"手搓"个AI新闻网站 AI编程从 “猜你想要” 到 “精准生成”, 基于Qoder的Spec驱动开发初探. Java团队Cursor最佳实践:3分钟构建「零泄漏」AI开发环境 再不用手写Commit!AI自动总结代码变更,Git提交效率 MCP赋能,给Cursor插上“外挂翅膀”:实战操作数据库 一个老程序员, 两个小时能用corsur做出什么样的东西 会用 AI 的工程师,效率已经拉开差距了 - “ 我们曾经引以为傲的编码能力,正在被改写。” 1-2 【包子mysql系列】, 对mysql的innoDB加锁分析 1-1, 一个简单的mysql 安装教程,基于mysql 5.7解压版本. Hystrix 服务的隔离策略对比,信号量与线程池隔离的差异 为什么阿里的dubbo注册中心要放弃zookeeper, 而用Nacos? 和spring cloud/boot 学习如何管理自己的组件 利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试 基础篇系列,JAVA的并发包 - 锁 撸基础篇系列,JAVA的NIO部分 1, 本地缓存的实现以及遇到的问题 JAVA的那些数据结构实现总结,实现,扩容说明 JAVA中的数据结构 - 真正的去理解红黑树 对把JDK源码的一些注解,笔记
spring mvc中,直接注入的HttpServletRequst是否安全呢?
何锦彬 · 2017-04-18 · via 博客园 - 何锦彬

看似很简单的一个问题,借此追踪下spring的源码处理

在写springMVC的Control中有很多这种代码, 如需要获取request对象去做某些事情

如:

@Controller
@RequestMapping(value = "/user") 
public class LoanActionPage extends AbstractAction {

@RequestMapping(value = "/page/active") 
public String loanAaccountActivePage(HttpServletRequest request) { 
// get  request to  dosomething
String pathInfo = request.getPathInfo();
return "active"; 
}

}

貌似每次要写个control时都得把request当住参数来传,很是冗余。

其实可以在control里定义一个request对象,注入,然后随时用

如:

public class  AbstractAction {
 @Autowired 
protected HttpServletRequest request;

... ...

然后在control中直接用:

@Controller
@RequestMapping(value = "/user") 
public class LoanActionPage extends AbstractAction {

@RequestMapping(value = "/page/active") 
public String loanAaccountActivePage() { 
// get  request to  dosomething
String pathInfo = request.getPathInfo();
return "active"; 
}
}

那么问题来了,sevlet是多线程的,每次请求的request其实是个新的对象,这样直接共享引用,是否会造成线程不安全呢?

方便了,问题也来了,servelt其实是多线程,共享一个request是否会有安全问题呢,分析下spring的代码

1, 注入的request何处来?

发现是注入其实是往WebApplicationContextUtils通过RequestObjectFactory拿值,跟踪

返回的是RequestContextHolder里的值. 追踪RequestContextHolder

每次返回的其实是, RequestAttributes的实现类ServletWebRequest(ServletRequestAttributes)里的request. 因为RequestAttributes是属于threadLocal的,所以注入的request也是线程安全的了

2, spring何时设置的request对象?

HttpServlet实现类 FrameworkServlet-> service()->processRequst()

每次请求都会往里面设置最新的request, 设值