[Java][web]利用Spring随时随地获得Request和Session
利用Spring隨時(shí)隨地獲得Request和Session
一、準(zhǔn)備工作:
在web.xml中加入??
<listener> <listener-class> org.springframework.web.context.request.RequestContextListener</listener-class> </listener>?
二、用法:
1、方法一:通過(guò)代碼實(shí)現(xiàn)
2、方法二:通過(guò)注解實(shí)現(xiàn):
@Autowired private HttpServletRequest request;
三、關(guān)于RequestContextListener的背景知識(shí): 基于LocalThread將HTTP request對(duì)象綁定到為該請(qǐng)求提供服務(wù)的線程上。這使得具有request和session作用域的bean可以在后面的調(diào)用鏈中被訪問(wèn)到。?
Request作用域?
<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>?
針對(duì)每次HTTP請(qǐng)求。Spring容器會(huì)依據(jù)loginAction bean定義創(chuàng)建一個(gè)全新的LoginAction bean實(shí)例,且該loginAction bean實(shí)例僅在當(dāng)前HTTP request內(nèi)有效,因此能夠依據(jù)須要放心的更改所建實(shí)例的內(nèi)部狀態(tài)。而其它請(qǐng)求中依據(jù)loginAction bean定義創(chuàng)建的實(shí)例,將不會(huì)看到這些特定于某個(gè)請(qǐng)求的狀態(tài)變化。
當(dāng)處理請(qǐng)求結(jié)束,request作用域的bean實(shí)例將被銷毀。?
Session作用域?
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>?
針對(duì)某個(gè)HTTP Session。Spring容器會(huì)依據(jù)userPreferences bean定義創(chuàng)建一個(gè)全新的userPreferences bean實(shí)例,且該userPreferences bean僅在當(dāng)前HTTP Session內(nèi)有效。與request作用域一樣,你能夠依據(jù)須要放心的更改所創(chuàng)建實(shí)例的內(nèi)部狀態(tài),而別的HTTP Session中依據(jù)userPreferences創(chuàng)建的實(shí)例,將不會(huì)看到這些特定于某個(gè)HTTP Session的狀態(tài)變化。當(dāng)HTTP Session終于被廢棄的時(shí)候,在該HTTP Session作用域內(nèi)的bean也會(huì)被廢棄掉。
?
global session作用域?
<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/>?
global session作用域類似于標(biāo)準(zhǔn)的HTTP Session作用域,只是它只在基于portlet的web應(yīng)用中才有意義。Portlet規(guī)范定義了全局Session的概念。它被全部構(gòu)成某個(gè)portlet web應(yīng)用的各種不同的portlet所共享。
在global session作用域中定義的bean被限定于全局portlet Session的生命周期范圍內(nèi)。?
請(qǐng)注意,假如你在編寫一個(gè)標(biāo)準(zhǔn)的基于Servlet的web應(yīng)用,而且定義了一個(gè)或多個(gè)具有g(shù)lobal session作用域的bean,系統(tǒng)會(huì)使用標(biāo)準(zhǔn)的HTTP Session作用域,而且不會(huì)引起不論什么錯(cuò)誤?
二、為什么須要額外的配置RequestContextFilter?
或許會(huì)有一個(gè)疑問(wèn),已經(jīng)通過(guò)ContextLoaderListener(或ContextLoaderServlet)將Web容器與Spring容器整合。為什么這里還要用額外的RequestContextListener以支持Bean的另外3個(gè)作用域,原因是ContextLoaderListener實(shí)現(xiàn)ServletContextListener監(jiān)聽(tīng)器接口,而ServletContextListener僅僅負(fù)責(zé)監(jiān)聽(tīng)Web容器的啟動(dòng)和關(guān)閉的事件。
RequestContextFilter實(shí)現(xiàn)ServletRequestListener監(jiān)聽(tīng)器接口,該監(jiān)聽(tīng)器監(jiān)聽(tīng)HTTP請(qǐng)求事件,Webserver接收的每次請(qǐng)求都會(huì)通知該監(jiān)聽(tīng)器。通過(guò)配置RequestContextFilter,Spring容器與Web容器結(jié)合的更加密切。
?
三、作用域依賴問(wèn)題?
假設(shè)將Web相關(guān)作用域的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>??
轉(zhuǎn)載于:https://www.cnblogs.com/llguanli/p/7372894.html
總結(jié)
以上是生活随笔為你收集整理的[Java][web]利用Spring随时随地获得Request和Session的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 看看大货车到底有多少盲区,肯定用得到!救
- 下一篇: 33 Java语言基础控制跳转语句标号