1. 程式人生 > >[Java][web]利用Spring隨時隨地獲得Request和Session

[Java][web]利用Spring隨時隨地獲得Request和Session

login html article -a private 綁定 ren alt 結束

利用Spring隨時隨地獲得Request和Session

一、準備工作:

在web.xml中加入

<listener>    
        <listener-class>    
            org.springframework.web.context.request.RequestContextListener
        </listener-class>    
</listener>


二、用法:
1、方法一:通過代碼實現

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();



2、方法二:通過註解實現:

@Autowired
private  HttpServletRequest request;



三、關於RequestContextListener的背景知識: 基於LocalThread將HTTP request對象綁定到為該請求提供服務的線程上。這使得具有request和session作用域的bean可以在後面的調用鏈中被訪問到。

Request作用域
<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>



針對每次HTTP請求。Spring容器會依據loginAction bean定義創建一個全新的LoginAction bean實例,且該loginAction bean實例僅在當前HTTP request內有效,因此能夠依據須要放心的更改所建實例的內部狀態。而其它請求中依據loginAction bean定義創建的實例,將不會看到這些特定於某個請求的狀態變化。

當處理請求結束,request作用域的bean實例將被銷毀。

Session作用域
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>


針對某個HTTP Session。Spring容器會依據userPreferences bean定義創建一個全新的userPreferences bean實例,且該userPreferences bean僅在當前HTTP Session內有效。與request作用域一樣,你能夠依據須要放心的更改所創建實例的內部狀態,而別的HTTP Session中依據userPreferences創建的實例,將不會看到這些特定於某個HTTP Session的狀態變化。當HTTP Session終於被廢棄的時候,在該HTTP Session作用域內的bean也會被廢棄掉。



global session作用域

<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/>

global session作用域類似於標準的HTTP Session作用域,只是它只在基於portlet的web應用中才有意義。Portlet規範定義了全局Session的概念。它被全部構成某個portlet web應用的各種不同的portlet所共享。

在global session作用域中定義的bean被限定於全局portlet Session的生命周期範圍內。

請註意,假如你在編寫一個標準的基於Servlet的web應用,而且定義了一個或多個具有global session作用域的bean,系統會使用標準的HTTP Session作用域,而且不會引起不論什麽錯誤
二、為什麽須要額外的配置RequestContextFilter
或許會有一個疑問,已經通過ContextLoaderListener(或ContextLoaderServlet)將Web容器與Spring容器整合。為什麽這裏還要用額外的RequestContextListener以支持Bean的另外3個作用域,原因是ContextLoaderListener實現ServletContextListener監聽器接口,而ServletContextListener僅僅負責監聽Web容器的啟動和關閉的事件。

RequestContextFilter實現ServletRequestListener監聽器接口,該監聽器監聽HTTP請求事件,Webserver接收的每次請求都會通知該監聽器。通過配置RequestContextFilter,Spring容器與Web容器結合的更加密切。


三、作用域依賴問題

假設將Web相關作用域的Bean註入到singleton或prototype的Bean中,這樣的情況下。須要Spring AOP

<bean name="car" class="com.demo.Car" scope="request">

<aop:scoped-proxy/>

</bean>

<bean id="boss" class="com.demo.Boss" >

<properrty name="car" ref="car" />

</bean>



[Java][web]利用Spring隨時隨地獲得Request和Session