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, 設值

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM