看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;
}
}
這樣在web請求過程中,在任何地方都可以調用這個靜態方法獲取request對象了。