[Java][web]利用Spring随时随地获得Request和Session
生活随笔
收集整理的這篇文章主要介紹了
[Java][web]利用Spring随时随地获得Request和Session
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用Spring隨時隨地獲得Request和Session
一、準備工作:
在web.xml中加入??
<listener> <listener-class> org.springframework.web.context.request.RequestContextListener</listener-class> </listener>?
二、用法:
1、方法一:通過代碼實現
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>??
轉載于:https://www.cnblogs.com/llguanli/p/7372894.html
總結
以上是生活随笔為你收集整理的[Java][web]利用Spring随时随地获得Request和Session的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看看大货车到底有多少盲区,肯定用得到!救
- 下一篇: JS函数表达的几种写法