溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

spring mvc中直接注入HttpServletRequst是不是安全的

發(fā)布時(shí)間:2021-09-10 13:42:40 來(lái)源:億速云 閱讀:168 作者:小新 欄目:編程語(yǔ)言

這篇文章主要為大家展示了“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)?

spring mvc中直接注入HttpServletRequst是不是安全的

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

spring mvc中直接注入HttpServletRequst是不是安全的

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

spring mvc中直接注入HttpServletRequst是不是安全的

每次返回的其實(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()

spring mvc中直接注入HttpServletRequst是不是安全的

每次請(qǐng)求都會(huì)往里面設(shè)置最新的request, 設(shè)值

以上是“spring mvc中直接注入HttpServletRequst是不是安全的”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI