1. 程式人生 > >spring中,在Java任何位置獲取request物件

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;  
    }  
    }