spring中,在Java任何位置獲取request物件
阿新 • • 發佈:2019-02-03
看RequestContextListener和RequestContextHolder原始碼不難看出,是用過ThreadLocal實現的。
ThreadLocal是什麼呢?看詞義,它並非是一個執行緒,它不是一個Thread,而是一個執行緒區域性變數,其實功能非常簡單,就是為每一個使用該變數的執行緒都提供一個變數值的副本,是每一個執行緒都可以獨立地改變自己的副本,而不會和其它執行緒的副本衝突。從執行緒的角度看,就好像每一個執行緒都完全擁有該變數。
每一個HTTP請求、都是一個獨立的執行緒,有一個獨立的ThreadLocal。利用該特性我們可以利用ThreadLocal進行、HTTP請求生命週期的暫時存取值,不同類之間進行傳值。
而RequestContextListener就是通過這一特性實現的。
操作方法如下:
第一步:在web.xml中,加入如下監聽。
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
第二步:寫一個靜態getRequest方法。
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; /** * 獲取當前請求物件 * @return */ public static HttpServletRequest getRequest(){ try{ return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); }catch(Exception e){ return null; } }