您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“spring mvc中直接注入HttpServletRequst是不是安全的”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“spring mvc中直接注入HttpServletRequst是不是安全的”這篇文章吧。
HttpServletRequest介紹
HttpServletRequest對(duì)象代表客戶(hù)端的請(qǐng)求,當(dāng)客戶(hù)端通過(guò)HTTP協(xié)議訪(fǎng)問(wèn)服務(wù)器時(shí),HTTP請(qǐng)求頭中的所有信息都封裝在這個(gè)對(duì)象中,通過(guò)這個(gè)對(duì)象提供的方法,可以獲得客戶(hù)端請(qǐng)求的所有信息。
引言
本文主要介紹的是關(guān)于spring mvc直接注入HttpServletRequst安全的相關(guān)內(nèi)容,看似很簡(jiǎn)單的一個(gè)問(wèn)題,借此追蹤下spring的源碼處理
在寫(xiě)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"; } }
貌似每次要寫(xiě)個(gè)control時(shí)都得把request當(dāng)住參數(shù)來(lái)傳,很是冗余。
其實(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"; } }
那么問(wèn)題來(lái)了,sevlet是多線(xiàn)程的,每次請(qǐng)求的request其實(shí)是個(gè)新的對(duì)象,這樣直接共享引用,是否會(huì)造成線(xiàn)程不安全呢?
方便了,問(wèn)題也來(lái)了,servelt其實(shí)是多線(xiàn)程,共享一個(gè)request是否會(huì)有安全問(wèn)題呢,分析下spring的代碼
1, 注入的request何處來(lái)?
發(fā)現(xiàn)是注入其實(shí)是往WebApplicationContextUtils通過(guò)RequestObjectFactory拿值,跟蹤
返回的是RequestContextHolder里的值. 追蹤RequestContextHolder
每次返回的其實(shí)是, RequestAttributes的實(shí)現(xiàn)類(lèi)ServletWebRequest(ServletRequestAttributes)里的request. 因?yàn)镽equestAttributes是屬于threadLocal的,所以注入的request也是線(xiàn)程安全的了
2, spring何時(shí)設(shè)置的request對(duì)象?
HttpServlet實(shí)現(xiàn)類(lèi) FrameworkServlet-> service()->processRequst()
每次請(qǐng)求都會(huì)往里面設(shè)置最新的request, 設(shè)值
以上是“spring mvc中直接注入HttpServletRequst是不是安全的”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。