HttpServletRequest介紹
HttpServletRequest對象代表客戶端的請求,當客戶端通過HTTP協議訪問服務器時,HTTP請求頭中的所有信息都封裝在這個對像中,通過這個對象提供的方法,可以獲得客戶端請求的所有信息。
引言
本文主要介紹的是關於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 dosomethingString pathInfo = request.getPathInfo();return "active";}}貌似每次要寫個control時都得把request當住參數來傳,很是冗餘。
其實可以在control裡定義一個request對象,注入,然後隨時用
如:
public class AbstractAction { @Autowiredprotected HttpServletRequest request;... ...然後在control中直接用:
@Controller@RequestMapping(value = "/user") public class LoanActionPage extends AbstractAction {@RequestMapping(value = "/page/active") public String loanAaccountActivePage() { // get request to dosomethingString 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, 設值
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。