redis session時,sessionId做爲token,可靠實現

場景:

在一些不能使用session,或者session不能保持的狀況,一般服務器端產生一個token字符串標識用戶登陸狀態。當前端調用後端接口時,將此token做爲參數加入到請求中,這樣可以避免依賴瀏覽器與服務端會話狀態。token身份驗證可用於多域名間保持用戶狀態,後端負載均衡非ip hash策略等狀況。前端

實現過程:

  1. pom中增長redis和session依賴
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
複製代碼
  1. 在登錄過程當中將用戶信息和其餘須要的信息放入session
HttpSession httpSession = request.getSession();
	httpSession.setAttribute("user", user);
複製代碼
  1. 把sessionId返回給前端
String sessionId = httpSession.getId();
    JSONObject result = new JSONObject();
    result.put("sessionId", sessionId);
複製代碼

這樣的流程就是常常使用session的方式。java

token(sessionId)使用過程(重點)

重點是從session中獲取user的過程,在接收到前端請求時,常見獲取user的實現代碼:git

User user = (User) httpSession.getAttribute("user");
複製代碼

可是這樣就沒有token什麼事了,並無是使用token來作驗證。若是要想使用token(sessionId)獲取到user,第一個想法就是直接從使用redisTemplate的hash操做,根據key獲取到裏面的內容,查看一下redis存儲session的key,如圖:github

這裏獲取還要注意序列化的問題,只有使用相同方式序列化key後才能獲取到值。redis

這種方式想一想就很複雜,難道沒有簡潔的方式獲取到這些值嗎,存進去的時候挺簡單,拿出來時候不能這麼麻煩吧。本着對spring強大的信心,尋找到了一個bean: RedisOperationsSessionRepository redisOperationsSessionRepository; 看到這個類的名字就很親切,猜測必定它必定可以解決問題。經過自動注入,而後調用方法,得出如下代碼:spring

Session session=redisOperationsSessionRepository.findById(sessionId);
if(session==null){
throw new ForbidException("請從新登陸");
}
user=session.getAttribute("user");
if(user==null){
redisOperationsSessionRepository.deleteById(sessionId);
}
複製代碼

注意這裏的session是org.springframework.session.Session,而不是javax.servlet.http.HttpSession(經常使用的那個session),可是二者有着密切關係,經過適配器模式,將javax.servlet.http.HttpSession轉爲org.springframework.session.Session。後端

這樣就能很方便的經過這個token(sessionId)獲取到存儲在redis的session的信息。瀏覽器

這裏顯然RedisOperationsSessionRepository是解決的關鍵點,至因而如何找到它,有兩種方法:bash

  • 第一種,看spring-session-data-redis和spring-session-core源碼,找到關鍵點,這種方法估計會多花3個小時的時間;
  • 第二種,最簡單直接,並且在找到以後再看源碼會更清晰,若是感興趣的話,評論超過5人,我更新文檔進行說明,嘎嘎,大神請飄過,或指教。

歡迎交流,不足之處請你們指正。服務器

歡迎訪問個人blog championjing.github.io/

相關文章
相關標籤/搜索