Spring Security原始碼分析九:Spring Security Session管理

鄭龍飛發表於2019-03-04

Session:在計算機中,尤其是在網路應用中,稱為“會話控制”。Session 物件儲存特定使用者會話所需的屬性及配置資訊。這樣,當使用者在應用程式的 Web 頁之間跳轉時,儲存在 Session 物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。當使用者請求來自應用程式的 Web 頁時,如果該使用者還沒有會話,則 Web 伺服器將自動建立一個 Session 物件。當會話過期或被放棄後,伺服器將終止該會話。Session 物件最常見的一個用法就是儲存使用者的首選項。

Session管理

本文主要描述在 Spring SecuritySession的以下三種管理,

  1. Session超時時間
  2. Session的併發策略
  3. 叢集環境Session處理

Session超時

  1. application.yml配置超時時間
server:
  port: 80
  session:
    timeout: 60
複製程式碼
  1. 配置MerryyouSecurityConfig
http.
......
	       .sessionManagement()
            .invalidSessionUrl("/session/invalid")//session失效跳轉的連結
.....
複製程式碼
  1. Cotroller/session/invalid
@GetMapping("/session/invalid")
    @ResponseStatus(code = HttpStatus.UNAUTHORIZED)
    public Result<String> sessionInvalid() {
        return ResultUtil.error(HttpStatus.UNAUTHORIZED.value(), "session失效");
    }
複製程式碼

效果如下:

https://user-gold-cdn.xitu.io/2018/1/19/1610da788886d37b?w=1012&h=651&f=gif&s=1292654
https://user-gold-cdn.xitu.io/2018/1/19/1610da788886d37b?w=1012&h=651&f=gif&s=1292654

Session的併發策略

  1. 配置MerryyouSecurityConfig
http.
......
	       .maximumSessions(1)//最大session併發數量1
           .maxSessionsPreventsLogin(false)//false之後登入踢掉之前登入,true則不允許之後登入
           .expiredSessionStrategy(new MerryyounExpiredSessionStrategy())//登入被踢掉時的自定義操作
.....
複製程式碼
  1. MerryyounExpiredSessionStrategy
@Slf4j
public class MerryyounExpiredSessionStrategy implements SessionInformationExpiredStrategy {
    @Override
    public void onExpiredSessionDetected(SessionInformationExpiredEvent eventØ) throws IOException, ServletException {
        eventØ.getResponse().setContentType("application/json;charset=UTF-8");
        eventØ.getResponse().getWriter().write("併發登入!");
    }
}
複製程式碼

效果如下:

https://user-gold-cdn.xitu.io/2018/1/19/1610da788874eadc?w=1291&h=722&f=gif&s=2921564
https://user-gold-cdn.xitu.io/2018/1/19/1610da788874eadc?w=1291&h=722&f=gif&s=2921564

maxSessionsPreventsLogin(true)可參考:Spring-Securitysecurity-oauth2

叢集環境Session處理

  1. 新增spring-session-data-redis依賴
<dependency>
			<groupId>org.springframework.session</groupId>
			<artifactId>spring-session-data-redis</artifactId>
			<version>1.3.1.RELEASE</version>
		</dependency>
複製程式碼
  1. 配置Spring-session儲存策略
spring:
  redis:
    host: localhost
    port: 6379
  session:
    store-type: redis
複製程式碼
  1. 測試80808081埠分別啟動專案
java -jar spring-security.jar --server.port=8080
java -jar spring-security.jar --server.port=8081
複製程式碼

效果如下:

https://user-gold-cdn.xitu.io/2018/1/19/1610da788866b600?w=1010&h=655&f=gif&s=1261985
https://user-gold-cdn.xitu.io/2018/1/19/1610da788866b600?w=1010&h=655&f=gif&s=1261985

關於更多Spring Session可參考:程式猿DD

程式碼下載

從我的 github 中下載,github.com/longfeizhen…

相關文章