【spring】spring中,在Java任何位置獲取request對象

看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對象了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章