spring mvc中直接注入的HttpServletRequst安全嗎
HttpServletRequest介紹
HttpServletRequest對(duì)象代表客戶端的請(qǐng)求,當(dāng)客戶端通過HTTP協(xié)議訪問服務(wù)器時(shí),HTTP請(qǐng)求頭中的所有信息都封裝在這個(gè)對(duì)象中,通過這個(gè)對(duì)象提供的方法,可以獲得客戶端請(qǐng)求的所有信息。
引言
本文主要介紹的是關(guān)于spring mvc直接注入HttpServletRequst安全的相關(guān)內(nèi)容,看似很簡(jiǎn)單的一個(gè)問題,借此追蹤下spring的源碼處理
在寫springMVC的Control中有很多這種代碼, 如需要獲取request對(duì)象去做某些事情
如:
@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"; } }
貌似每次要寫個(gè)control時(shí)都得把request當(dāng)住參數(shù)來傳,很是冗余。
其實(shí)可以在control里定義一個(gè)request對(duì)象,注入,然后隨時(shí)用
如:
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是多線程的,每次請(qǐng)求的request其實(shí)是個(gè)新的對(duì)象,這樣直接共享引用,是否會(huì)造成線程不安全呢?
方便了,問題也來了,servelt其實(shí)是多線程,共享一個(gè)request是否會(huì)有安全問題呢,分析下spring的代碼
1, 注入的request何處來?
發(fā)現(xiàn)是注入其實(shí)是往WebApplicationContextUtils通過RequestObjectFactory拿值,跟蹤
返回的是RequestContextHolder里的值. 追蹤RequestContextHolder
每次返回的其實(shí)是, RequestAttributes的實(shí)現(xiàn)類ServletWebRequest(ServletRequestAttributes)里的request. 因?yàn)镽equestAttributes是屬于threadLocal的,所以注入的request也是線程安全的了
2, spring何時(shí)設(shè)置的request對(duì)象?
HttpServlet實(shí)現(xiàn)類 FrameworkServlet-> service()->processRequst()
每次請(qǐng)求都會(huì)往里面設(shè)置最新的request, 設(shè)值
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Android :okhttp+Springmvc文件解析器實(shí)現(xiàn)android向服務(wù)器上傳照片
- 如何基于SpringMVC實(shí)現(xiàn)斷點(diǎn)續(xù)傳(HTTP)
- SpringMvc/SpringBoot HTTP通信加解密的實(shí)現(xiàn)
- springmvc中RequestMappingHandlerAdapter與HttpMessageConverter的裝配講解
- 詳解自定義SpringMVC的Http信息轉(zhuǎn)換器的使用
- SpringMVC源碼解析之消息轉(zhuǎn)換器HttpMessageConverter
- 詳解Http請(qǐng)求中Content-Type講解以及在Spring MVC中的應(yīng)用
- SpringMVC 中HttpMessageConverter簡(jiǎn)介和Http請(qǐng)求415 的問題
- Spring MVC獲取HTTP請(qǐng)求頭的兩種方式小結(jié)
相關(guān)文章
Java Web端程序?qū)崿F(xiàn)文件下載的方法分享
這篇文章主要介紹了Java Web端程序?qū)崿F(xiàn)文件下載的方法分享,包括一個(gè)包含防盜鏈功能的專門針對(duì)圖片下載的程序代碼示例,需要的朋友可以參考下2016-05-05IDEA 設(shè)置顯示內(nèi)存的使用情況和內(nèi)存回收的方法
這篇文章主要介紹了IDEA 設(shè)置顯示內(nèi)存的使用情況和內(nèi)存回收的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04解決scala.collection.mutable.Map寫入的問題
這篇文章主要介紹了解決scala.collection.mutable.Map寫入的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Spring如何根據(jù)條件創(chuàng)建bean,@Conditional注解使用方式
這篇文章主要介紹了Spring如何根據(jù)條件創(chuàng)建bean,@Conditional注解使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Springboot整合MongoDB進(jìn)行CRUD操作的兩種方式(實(shí)例代碼詳解)
這篇文章主要介紹了Springboot整合MongoDB進(jìn)行CRUD操作的兩種方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04Java的Struts框架中<results>標(biāo)簽的使用方法
這篇文章主要介紹了Java的Struts框架中<results>標(biāo)簽的使用方法,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-11-11