spring mvc中,直接注入的HttpServletRequst是否安全呢?
看似很简单的一个问题,借此追踪下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, 设值
spring mvc中,直接注入的HttpServletRequst是否安全呢?的更多相关文章
- Spring.Net是怎么在MVC中实现注入的(原理)
本文将介绍Spring.Net(不仅仅是Spring.Net,其实所有的IoC容器要向控制器中进行注入,原理都是差不多的)在MVC控制器中依赖注入的实现原理,本文并没有关于在MVC使用Spring怎么 ...
- Spring MVC 中的基于注解的 Controller【转】
原文地址:http://my.oschina.net/abian/blog/128028 终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 H ...
- spring mvc中的valid
当你希望在spring mvc中直接校验表单参数时,你可以采用如下操作: 声明Validator的方式: 1.为每一个Controller声明一个Validator @Controller publi ...
- Spring MVC中基于注解的 Controller
终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响 ...
- Spring MVC中各个filter的用法
转载:http://blog.csdn.net/qyp1314/article/details/42023725 Spring MVC中各个filter的用法 2014-12-19 09:08 105 ...
- Spring MVC 中获取session的几种方法
Spring MVC 中使用session是一种常见的操作,但是大家上网搜索一下可以看到获取session的方式方法五花八门,最近,自己终结了一下,将获取session的方法记录下来,以便大家共同学习 ...
- Spring MVC 中 @ModelAttribute 注解的妙用
Spring MVC 中 @ModelAttribute 注解的妙用 Spring MVC 提供的这种基于注释的编程模型,极大的简化了 web 应用的开发.其中 @Controller 和 @Rest ...
- spring 以及 spring mvc 中常用注解整理
spring 以及 spring mvc 中常用注解整理 @RequestMapping(映射路径) @Autowired(注入 bean 对象) 例如: @Autowired private Bas ...
- Spring MVC 中的基于注解的 Controller(转载)
终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法 ...
- Spring mvc中@RequestMapping 6个基本用法
Spring mvc中@RequestMapping 6个基本用法 spring mvc中的@RequestMapping的用法. 1)最基本的,方法级别上应用,例如: Java代码 @Reques ...
随机推荐
- Flume-ng源码解析之Sink组件
作为启动流程中第二个启动的组件,我们今天来看看Sink的细节 1 Sink Sink在agent中扮演的角色是消费者,将event输送到特定的位置 首先依然是看代码,由代码我们可以看出Sink是一个接 ...
- <c>----<choose><when><otherwise>
<c:choose> <c:when test="${username== '1' && password== '2'}"> <jsp ...
- [.net 面向对象程序设计深入](14)Redis——基础
[.net 面向对象程序设计深入](14)Redis——基础 很长一段时间没更新博客了,坚持做一件事,真不是件容易的事,后面我会继续尽可能的花时间更新完这个系列文章. 因这个系列的文章涉及的范围太大了 ...
- vbs文件小技巧
vbs文件介绍: VBS是基于Visual Basic的脚本语言.VBS的全称是:Microsoft Visual Basic Script Editon.(微软公司可视化BASIC脚本版). 可以新 ...
- cookie 详解 与 封装 实用的cookie
在WEB前端开发中,cookie是必不可少的,网上也有很多开源的库可以使用,不过我还是想自己总结一下,做个笔记并封装一个实用的库.(1)什么是cookie? 从web 角度 cookie是用于存储信息 ...
- Gridview AutoGenerateColumns属性
第一篇随笔,以后会陆续的把刚开始工作时的知识点都记录下来,毕竟现在用WebForm的不多了~ AutoGenerateColumns MSDN 说明 : 获取或设置一个值,该值指示是否为数据源中的每个 ...
- iOS切圆角的几个方法
这几天在研究到切圆角的方法,也找了下网上的资料 ---------- 切圆角尽量避免离屏渲染. 1.直接用视图中layer中的两个属性来设置圆角,这种方法比较简单,但是及其影响性能不推荐: @pro ...
- Thrift序列化与反序列化的实现机制分析
Thrift是如何实现序死化与反序列化的,在IDL文件中,更改IDL文件中的变量序号或者[使用默认序号的情况下,新增变量时,将新增的变量不放在IDL文件的结尾,均会导致Thrift文件的反序列后无法做 ...
- ehcache 使用笔记
要想使用 java 的本地缓存,可以考虑用 ehcache,或者 guava. guava 更高端一点,可以自动定时刷新.我选择了 ehcache. 在 spring 中是集成了 ehcache 的. ...
- ps-修复
1- 复制图层 2- 工具栏——套索——多变套索工具——上侧工具栏——羽化(15像素) 选区,防止其他区域被修改 羽化,让修改的边缘柔和化 3- 选项区——编辑——填充 ...