Spring Security源碼分析九:Spring Security Session管理

Session:在計算機中,尤爲是在網絡應用中,稱爲「會話控制」。Session 對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web 頁時,若是該用戶尚未會話,則 Web 服務器將自動建立一個 Session 對象。當會話過時或被放棄後,服務器將終止該會話。Session 對象最多見的一個用法就是存儲用戶的首選項。java

Session管理

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

  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失效");
    }
複製代碼

效果以下: github

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("併發登陸!");
    }
}
複製代碼

效果以下: redis

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-oauth2spring

集羣環境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
複製代碼

效果以下:json

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…網絡

相關文章
相關標籤/搜索