springsecurity中session的并发控制
项目源码地址
1 是什么?
-
超过设置的最大session并发数量时,把之前的session失效掉,即踢掉前面的登陆 超过设置的最大session并发数量时,阻止后面的登陆
2 超过最大并发数量时,踢掉前面的登陆
-
在配置文件BrowserSecurityConfig里指定最大的并发数量
//session相关的控制
.sessionManagement()
//指定session超时跳向的url
.invalidSessionUrl("/session/invalid")
//指定最大的session并发数量---即一个用户只能同时在一处登陆(腾讯视频的账号好像就只能同时允许2-3个手机同时登陆)
.maximumSessions(1)
//超过最大session并发数量时的策略
.expiredSessionStrategy(new NRSCExpiredSessionStrategy())
-
超过最大session并发数量时的策略
package com.nrsc.security.browser.session;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.nrsc.security.enums.ResultEnum;
import com.nrsc.security.utils.ResultVOUtil;
import com.nrsc.security.vo.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.web.session.SessionInformationExpiredEvent;
import org.springframework.security.web.session.SessionInformationExpiredStrategy;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* @author : Sun Chuan
* @date : 2019/9/21 17:14
* Description:
* 如果设置的session并发策略为一个账户第二次登陆会将第一次给踢下来
* 则第一次登陆的用户再访问我们的项目时会进入到该类
* event里封装了request、response信息
*/
@Slf4j
public class NRSCExpiredSessionStrategy implements SessionInformationExpiredStrategy {
@Override
public void onExpiredSessionDetected(SessionInformationExpiredEvent event) throws IOException, ServletException {
String header = event.getRequest().getHeader("user-agent");
log.info("浏览器信息为:{}", header);
//告诉前端并发登陆异常
event.getResponse().setContentType("application/json;charset=UTF-8");
event.getResponse().getWriter().write("并发登陆!!!");
}
}
3 超过最大并发数量时,阻止后面的登陆
//session相关的控制
.sessionManagement()
//指定session超时跳向的url
.invalidSessionUrl("/session/invalid")
//指定最大的session并发数量---即一个用户只能同时在一处登陆(腾讯视频的账号好像就只能同时允许2-3个手机同时登陆)
.maximumSessions(1)
//当超过指定的最大session并发数量时,阻止后面的登陆(感觉貌似很少会用到这种策略)
.maxSessionsPreventsLogin(true)
//超过最大session并发数量时的策略
.expiredSessionStrategy(new NRSCExpiredSessionStrategy())
上一篇:
IDEA上Java项目控制台中文乱码
