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项目控制台中文乱码