spring mvc中直接注入的HttpServletRequst安全嗎
HttpServletRequest介紹
HttpServletRequest對象代表客戶端的請求,當(dāng)客戶端通過HTTP協(xié)議訪問服務(wù)器時,HTTP請求頭中的所有信息都封裝在這個對象中,通過這個對象提供的方法,可以獲得客戶端請求的所有信息。
引言
本文主要介紹的是關(guān)于spring mvc直接注入HttpServletRequst安全的相關(guān)內(nèi)容,看似很簡單的一個問題,借此追蹤下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當(dāng)住參數(shù)來傳,很是冗余。
其實可以在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何處來?

發(fā)現(xiàn)是注入其實是往WebApplicationContextUtils通過RequestObjectFactory拿值,跟蹤

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

每次返回的其實是, RequestAttributes的實現(xiàn)類ServletWebRequest(ServletRequestAttributes)里的request. 因為RequestAttributes是屬于threadLocal的,所以注入的request也是線程安全的了
2, spring何時設(shè)置的request對象?
HttpServlet實現(xiàn)類 FrameworkServlet-> service()->processRequst()

每次請求都會往里面設(shè)置最新的request, 設(shè)值
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
- Android :okhttp+Springmvc文件解析器實現(xiàn)android向服務(wù)器上傳照片
- 如何基于SpringMVC實現(xiàn)斷點續(xù)傳(HTTP)
- SpringMvc/SpringBoot HTTP通信加解密的實現(xiàn)
- springmvc中RequestMappingHandlerAdapter與HttpMessageConverter的裝配講解
- 詳解自定義SpringMVC的Http信息轉(zhuǎn)換器的使用
- SpringMVC源碼解析之消息轉(zhuǎn)換器HttpMessageConverter
- 詳解Http請求中Content-Type講解以及在Spring MVC中的應(yīng)用
- SpringMVC 中HttpMessageConverter簡介和Http請求415 的問題
- Spring MVC獲取HTTP請求頭的兩種方式小結(jié)
相關(guān)文章
IDEA創(chuàng)建的maven項目中pom.xml增加新依賴無效問題及解決
在IDEA中,解決maven項目pom.xml增加依賴但外部庫未更新的問題,可以通過設(shè)置"構(gòu)建腳本更改后同步項目"選項為"任何更改",然后刷新Maven項目來解決2025-01-01
Java中System.currentTimeMillis()計算方式與時間單位轉(zhuǎn)換講解
本文詳細(xì)講解了Java中System.currentTimeMillis()計算方式與時間單位轉(zhuǎn)換,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12
詳解SpringBoot中異步請求的實現(xiàn)與并行執(zhí)行
這篇文章主要為大家詳細(xì)介紹了在SpringBoot中如何是實現(xiàn)異步請求、并行執(zhí)行,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
Java調(diào)用python代碼的五種方式總結(jié)
這篇文章主要給大家介紹了關(guān)于Java調(diào)用python代碼的五種方式,在Java中調(diào)用Python函數(shù)的方法有很多種,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09

