Java Springboot 如何利用Redis完成Session操作(登錄,注銷等)


前沿

在Java Web開發中,如果你要做動態網頁或者記錄用戶的相關信息等等,必然會或多或少涉及到Session的操作。

Session

session是什么呢?簡單地來說,相當於一個有時間限制的會話“身份ID”,它維持了一段時間的客戶端和服務器的會話,保證服務器知道和它的客戶端是誰,客戶端是否還在有效期等;具體的專業解釋,在網上有很多,請自行查閱

痛點

  1. 原始的Session是存在內存中,如果機器或者進程重啟,Session就會消失,用戶在本來的有效期內還是會重新登錄
  2. 如果將Session存放在MySql之類的數據庫中,雖然保證了重啟后session不會消失,但是管理Session將會是很繁瑣的,而且還會遇到很多並發的問題

如何解決呢?

Springboot本身結合了Redis這樣的緩存數據庫,session的操作都是自動,不用考慮重啟和各種管理問題,也可以應對適量的並發(大量的並發問題暫不考慮)

Redis

Redis眾所周知是一個速度很快(可以直接從內存中讀取)的Key-Value數據結構的數據庫,通常用來做緩存,或者存儲類型簡單的數據,而且它有一套很完善的數據有效期機制。因此,Springboot就默認采用Redis來存儲Session

開工

1.導入redis和session所需要的庫(pom.xml)

在pom.xml文件中,添加


    
    
    
            
  1. <!--Redis依賴-->
  2. <dependency>
  3. <groupId>org.springframework.boot </groupId>
  4. <artifactId>spring-boot-starter-redis </artifactId>
  5. <version>1.4.7.RELEASE </version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.session </groupId>
  9. <artifactId>spring-session-data-redis </artifactId>
  10. <!--<version>2.0.6</version>-->
  11. </dependency>

2.Redis數據庫的配置(application.properties)

在application.properties文件中,添加以下的配置(簡化版,甚至都不用配置Configuration):


    
    
    
            
  1. #Redis相關配置
  2. spring.redis.host=localhost
  3. spring.redis.port= 6379

3.定義一個登錄注銷的Contoller

因為Springboot默認采用redis來存儲管理Session,因此,我們也不必手動添加或者移除session,Springboot會自動幫我們管理


    
    
    
            
  1. package com.helang.session;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RequestMethod;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpSession;
  7. /**
  8. * 用戶登錄注銷Controller
  9. * @author helang
  10. */
  11. @RequestMapping
  12. @RestController
  13. public class LoginController {
  14. /**
  15. * 這里為了能簡單在瀏覽器響應,暫時使用GET請求,
  16. * @return
  17. */
  18. @RequestMapping(value = "login",method = RequestMethod.GET)
  19. public String login(HttpServletRequest request){
  20. String account = request.getParameter( "account");
  21. String password = request.getParameter( "password");
  22. if ( "123".equals(account) && "123456".equals(password)){
  23. /*如果已經存在Session的話,直接返回它;沒有就創建一個,再返回
  24. * 當然Session是自動放在response中的Header中的,這里不用做其他處理*/
  25. request.getSession();
  26. } else {
  27. return "failed";
  28. }
  29. return "success";
  30. }
  31. /**
  32. * 判斷用戶的session是否有效(在同一個瀏覽器中,同一個域中,每次Request請求,都會帶上Session)
  33. * @param request
  34. * @return
  35. */
  36. @RequestMapping(value = "isValid",method = RequestMethod.GET)
  37. public String isSessionValid(HttpServletRequest request){
  38. //簡化if-else表達式(其實很多地方可以簡化的,這里為了方便新手朋友可以看得順暢點,我盡量不簡化)
  39. return request.isRequestedSessionIdValid() ? "ok": "no";
  40. }
  41. /**
  42. * 注銷登錄
  43. * @param session
  44. * @return
  45. */
  46. @RequestMapping(value = "logout",method = RequestMethod.GET)
  47. public String logout(HttpSession session){
  48. session.invalidate(); //使Session變成無效,及用戶退出
  49. return "logout";
  50. }
  51. }

效果

1.登錄

很明顯,session是放在response中的header的返回給客戶端的;之后客戶端的每次請求的Request的header都會帶上這個session

2.服務器檢查session是否有效

默認情況下,session有效期是30分鍾,當然你也可以修改,這里就不做演示了;利用session的有效期,你可以控制客戶端的相關業務的請求操作

3.注銷登錄(用戶退出登錄)

就一行代碼:session.invalidate(); 是不是比起其他框架來說,要簡單得多呢

4.再次檢查session是否有效

可以看到客戶端的session已經失效了,客戶端也可以根據這個結果,做相應的操作,比如讓用戶回到登錄頁面,重新登錄

擴展

當然,結合Redis,我們可以很容易分布式Session,即共享Session,方便用戶能夠單點登錄

總結

Springboot確實簡化了JavaWeb開發的操作;當然,我們也不能停留到表面的業務操作中,在合適的時候,一定要深入Springboot中的源碼中去,才能解決很多棘手的問題,也才能體會到Spring的博大精深

Github

代碼很少,也很簡單,我也把代碼分享到Github中,方便新手朋友們學習

https://github.com/helang1991/SpringbootSession

原創:https://blog.csdn.net/helang296479893/article/details/83787798


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM