Spring MVC 中獲取session的幾種方法(小結(jié))
Spring MVC 中使用session是一種常見(jiàn)的操作,但是大家上網(wǎng)搜索一下可以看到獲取session的方式方法五花八門,最近,自己終結(jié)了一下,將獲取session的方法記錄下來(lái),以便大家共同學(xué)習(xí)進(jìn)步。
第一種:將HttpSession作為Spring MVC 的方法參數(shù)傳入,直接獲取。
直接在Spring MVC 的方法中將參數(shù)傳入:
public void getSessionAction(HttpSession session){ }
這種方法我再網(wǎng)上搜索時(shí)發(fā)現(xiàn)很多人并不推薦使用,但是在簡(jiǎn)單的測(cè)試中發(fā)現(xiàn),還是可以使用的,不推薦的具體原因很多文章中并沒(méi)有說(shuō)明。
第二種:將HttpServletRequest作為Spring MVC 的方法參數(shù),間接獲取
先是獲取到request,然后通過(guò)request間接的獲取到session,代碼如下:
public void getSessionAction(HttpServletRequest request){ HttpSession session = request.getSession(); }
這種方法時(shí)比較常見(jiàn)的一種,但是有些人會(huì)覺(jué)得這種比較麻煩,因?yàn)槊看问褂胹ession都需要傳入一個(gè)參數(shù)(你到底是有多懶),于是就有了第三種方法
第三種:通過(guò)@Autowired HttpServletRequest request 獲取
這種方式類似于我們注入service類的時(shí)候是一樣的,第一眼看到這種方式的時(shí)候我是拒絕的,因?yàn)槲覀兌贾溃瑂ervlet是默認(rèn)采用單例多線程的方式處理多用戶請(qǐng)求的,如果直接把它寫(xiě)成一個(gè)全局的變量,會(huì)不會(huì)是不安全的?不過(guò)這里·基于spring注解的,所以基本上可以確保線程的安全性。但是說(shuō)實(shí)在,我還是不放心,于是上網(wǎng)查了一些資料,最后看了看spring這部分的源碼(我會(huì)在另一片文章中詳細(xì)和大家討論的),最后發(fā)現(xiàn)這樣做是完全可行的。
第四種:使用RequestContextHolder類獲取request,間接獲取到session
通過(guò)使用RequestContextHolder這個(gè)類我們可以在不傳入HttpServletRequest,直接獲取到本次請(qǐng)求中的request。一般使用中我們會(huì)對(duì)它進(jìn)行封裝,做成一個(gè)工具方法進(jìn)行使用:
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
注意進(jìn)行強(qiáng)轉(zhuǎn)成為ServletRequestAttributes,具體原因可以在源碼中找到(有點(diǎn)廢話了),大致的原理就是,RequestContextHolder類中有兩個(gè)ThreadLocal保存當(dāng)前線程下的request,每次我們調(diào)用getRequestAttributes()的時(shí)候就會(huì)獲取到當(dāng)前的request,調(diào)用springmvc方法的時(shí)候沒(méi)有傳入request,那么這個(gè)request是在哪里獲取到的呢?看源碼可以知道,是在一個(gè)processRequest(HttpServletRequest request, HttpServletResponse response)這個(gè)方法里面,每次挑用doget(),dopost()的時(shí)候都會(huì)條用這個(gè)方法,將我們的request,response傳進(jìn)去。
第五種: 使用@SessionAttributes
確切來(lái)說(shuō)這種方式并不是直接獲取到session,但是我們可以通過(guò)這種方式將我們想要值放入到session中去。
其實(shí)總結(jié)是一個(gè)好習(xí)慣,在總結(jié)獲取session的方法過(guò)程中,看到了去多相關(guān)的博文,學(xué)習(xí)了一些意想不到的東西,所以想要拿出來(lái),大家一起討論。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
idea編譯報(bào)錯(cuò)-代碼沒(méi)問(wèn)題IDEA編譯不通過(guò)的處理方案
這篇文章主要介紹了idea編譯報(bào)錯(cuò)-代碼沒(méi)問(wèn)題IDEA編譯不通過(guò)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案
這篇文章主要介紹了springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01springsecurity第三方授權(quán)認(rèn)證的項(xiàng)目實(shí)踐
Spring security 是一個(gè)強(qiáng)大的和高度可定制的身份驗(yàn)證和訪問(wèn)控制框架,本文主要介紹了springsecurity第三方授權(quán)認(rèn)證的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣可以了解一下2023-08-08梳理總結(jié)Java?static關(guān)鍵字的方法作用
這篇文章主要介紹了梳理總結(jié)Java?static關(guān)鍵字的方法作用,?static?關(guān)鍵字可以用來(lái)修飾的成員變量和成員方法,被修飾的成員是屬于類的,而不是單單是屬于某個(gè)對(duì)象的2022-06-06java 如何給對(duì)象中的包裝類設(shè)置默認(rèn)值
這篇文章主要介紹了java 如何給對(duì)象中的包裝類設(shè)置默認(rèn)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Jboss Marshalling服務(wù)端無(wú)法接受消息
這篇文章主要介紹了Jboss Marshalling服務(wù)端無(wú)法接受消息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03