前沿
在Java Web開發中,如果你要做動態網頁或者記錄用戶的相關信息等等,必然會或多或少涉及到Session的操作。
Session
session是什么呢?簡單地來說,相當於一個有時間限制的會話“身份ID”,它維持了一段時間的客戶端和服務器的會話,保證服務器知道和它的客戶端是誰,客戶端是否還在有效期等;具體的專業解釋,在網上有很多,請自行查閱
痛點
- 原始的Session是存在內存中,如果機器或者進程重啟,Session就會消失,用戶在本來的有效期內還是會重新登錄
- 如果將Session存放在MySql之類的數據庫中,雖然保證了重啟后session不會消失,但是管理Session將會是很繁瑣的,而且還會遇到很多並發的問題
如何解決呢?
Springboot本身結合了Redis這樣的緩存數據庫,session的操作都是自動,不用考慮重啟和各種管理問題,也可以應對適量的並發(大量的並發問題暫不考慮)
Redis
Redis眾所周知是一個速度很快(可以直接從內存中讀取)的Key-Value數據結構的數據庫,通常用來做緩存,或者存儲類型簡單的數據,而且它有一套很完善的數據有效期機制。因此,Springboot就默認采用Redis來存儲Session
開工
1.導入redis和session所需要的庫(pom.xml)
在pom.xml文件中,添加
-
<!--Redis依賴-->
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-redis
</artifactId>
-
<version>1.4.7.RELEASE
</version>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.session
</groupId>
-
<artifactId>spring-session-data-redis
</artifactId>
-
<!--<version>2.0.6</version>-->
-
</dependency>
2.Redis數據庫的配置(application.properties)
在application.properties文件中,添加以下的配置(簡化版,甚至都不用配置Configuration):
-
#Redis相關配置
-
spring.redis.host=localhost
-
spring.redis.port=
6379
3.定義一個登錄注銷的Contoller
因為Springboot默認采用redis來存儲管理Session,因此,我們也不必手動添加或者移除session,Springboot會自動幫我們管理
-
package com.helang.session;
-
-
import org.springframework.web.bind.annotation.RequestMapping;
-
import org.springframework.web.bind.annotation.RequestMethod;
-
import org.springframework.web.bind.annotation.RestController;
-
-
import javax.servlet.http.HttpServletRequest;
-
import javax.servlet.http.HttpSession;
-
-
/**
-
* 用戶登錄注銷Controller
-
* @author helang
-
*/
-
@RequestMapping
-
@RestController
-
-
public
class LoginController {
-
-
/**
-
* 這里為了能簡單在瀏覽器響應,暫時使用GET請求,
-
* @return
-
*/
-
@RequestMapping(value = "login",method = RequestMethod.GET)
-
public String login(HttpServletRequest request){
-
String account = request.getParameter(
"account");
-
String password = request.getParameter(
"password");
-
if (
"123".equals(account) &&
"123456".equals(password)){
-
/*如果已經存在Session的話,直接返回它;沒有就創建一個,再返回
-
* 當然Session是自動放在response中的Header中的,這里不用做其他處理*/
-
request.getSession();
-
}
else {
-
return
"failed";
-
}
-
return
"success";
-
}
-
-
/**
-
* 判斷用戶的session是否有效(在同一個瀏覽器中,同一個域中,每次Request請求,都會帶上Session)
-
* @param request
-
* @return
-
*/
-
@RequestMapping(value = "isValid",method = RequestMethod.GET)
-
public String isSessionValid(HttpServletRequest request){
-
//簡化if-else表達式(其實很多地方可以簡化的,這里為了方便新手朋友可以看得順暢點,我盡量不簡化)
-
return request.isRequestedSessionIdValid() ?
"ok":
"no";
-
}
-
-
/**
-
* 注銷登錄
-
* @param session
-
* @return
-
*/
-
@RequestMapping(value = "logout",method = RequestMethod.GET)
-
public String logout(HttpSession session){
-
session.invalidate();
//使Session變成無效,及用戶退出
-
return
"logout";
-
}
-
}
效果
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://blog.csdn.net/helang296479893/article/details/83787798