1. 程式人生 > >spring mvc 獲得session 的幾種辦法

spring mvc 獲得session 的幾種辦法

裝載來自:https://www.cnblogs.com/wudb/archive/2017/08/31/7458856.html

Spring MVC 中使用session是一種常見的操作,但是大家上網搜尋一下可以看到獲取session的方式方法五花八門,最近,自己終結了一下,將獲取session的方法記錄下來,以便大家共同學習進步。

第一種:將HttpSession作為Spring MVC 的方法引數傳入,直接獲取。

         直接在Spring MVC 的方法中將引數傳入:

public void getSessionAction(HttpSession session){
}

       這種方法我再網上搜索時發現很多人並不推薦使用,但是在簡單的測試中發現,還是可以使用的,不推薦的具體原因很多文章中並沒有說明。

第二種:將HttpServletRequest作為Spring MVC 的方法引數,間接獲取

      先是獲取到request,然後通過request間接的獲取到session,程式碼如下:

public void getSessionAction(HttpServletRequest request){
  HttpSession session = request.getSession();
}

    這種方法時比較常見的一種,但是有些人會覺得這種比較麻煩,因為每次使用session都需要傳入一個引數(你到底是有多懶),於是就有了第三種方法

第三種:通過@Autowired HttpServletRequest request 獲取

       這種方式類似於我們注入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的方法過程中,看到了去多相關的博文,學習了一些意想不到的東西,所以想要拿出來,大家一起討論,如果還有需要補充的或者是錯誤之處,煩請指教。