Spring MVC 中使用session是一種常見的操做,可是你們上網搜索一下能夠看到獲取session的方式方法五花八門,最近,本身終結了一下,將獲取session的方法記錄下來,以便你們共同窗習進步。java
第一種:將HttpSession做爲Spring MVC 的方法參數傳入,直接獲取。spring
直接在Spring MVC 的方法中將參數傳入:安全
public void getSessionAction(HttpSession session){ }
這種方法我再網上搜索時發現不少人並不推薦使用,可是在簡單的測試中發現,仍是能夠使用的,不推薦的具體緣由不少文章中並無說明。session
第二種:將HttpServletRequest做爲Spring MVC 的方法參數,間接獲取多線程
先是獲取到request,而後經過request間接的獲取到session,代碼以下:mvc
public void getSessionAction(HttpServletRequest request){ HttpSession session = request.getSession(); }
這種方法時比較常見的一種,可是有些人會以爲這種比較麻煩,由於每次使用session都須要傳入一個參數(你究竟是有多懶),因而就有了第三種方法工具
第三種:經過@Autowired HttpServletRequest request 獲取post
這種方式相似於咱們注入service類的時候是同樣的,第一眼看到這種方式的時候我是拒絕的,由於咱們都知道,servlet是默認採用單例多線程的方式處理多用戶請求的,若是直接把它寫成一個全局的變量,會不會是不安全的?不過這裏·基於spring註解的,因此基本上能夠確保線程的安全性。可是說實在,我仍是不放心,因而上網查了一些資料,最後看了看spring這部分的源碼(我會在另外一片文章中詳細和你們討論的),最後發現這樣作是徹底可行的。學習
第四種:使用RequestContextHolder類獲取request,間接獲取到session測試
經過使用RequestContextHolder這個類咱們能夠在不傳入HttpServletRequest,直接獲取到本次請求中的request。通常使用中咱們會對它進行封裝,作成一個工具方法進行使用:
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
注意進行強轉成爲ServletRequestAttributes,具體緣由能夠在源碼中找到(有點廢話了),大體的原理就是,RequestContextHolder類中有兩個ThreadLocal保存當前線程下的request,每次咱們調用getRequestAttributes()的時候就會獲取到當前的request,調用springmvc方法的時候沒有傳入request,那麼這個request是在哪裏獲取到的呢?看源碼能夠知道,是在一個processRequest(HttpServletRequest request, HttpServletResponse response)
這個方法裏面,每次挑用doget(),dopost()的時候都會條用這個方法,將咱們的request,response傳進去。
第五種: 使用@SessionAttributes
確切來講這種方式並非直接獲取到session,可是咱們能夠經過這種方式將咱們想要值放入到session中去。
其實總結是一個好習慣,在總結獲取session的方法過程當中,看到了去多相關的博文,學習了一些意想不到的東西,因此想要拿出來,你們一塊兒討論,若是還有須要補充的或者是錯誤之處,煩請指教。