在一些不能使用session,或者session不能保持的狀況,一般服務器端產生一個token字符串標識用戶登陸狀態。當前端調用後端接口時,將此token做爲參數加入到請求中,這樣可以避免依賴瀏覽器與服務端會話狀態。token身份驗證可用於多域名間保持用戶狀態,後端負載均衡非ip hash策略等狀況。前端
<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>
複製代碼
HttpSession httpSession = request.getSession();
httpSession.setAttribute("user", user);
複製代碼
String sessionId = httpSession.getId();
JSONObject result = new JSONObject();
result.put("sessionId", sessionId);
複製代碼
這樣的流程就是常常使用session的方式。java
重點是從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
歡迎交流,不足之處請你們指正。服務器
歡迎訪問個人blog championjing.github.io/