Spring Security区分session失效与踢出登录策略

 

两种场景简单说明

session失效:正常session过期,需要提示用户登录过期等提示,跳回登录页,让用户重新登录。
踢出登录:系统只允许设备单一登录,一旦账号在另一个设备如浏览器登录了,则前一个登录账号会被踢出,同时给用户一个账号在另一个地方登录,防止密码泄漏等友好提示。

session失效策略实现

在Security的配置文件中, configure(HttpSecurity http) 方法里,构建时增加上session管理配置,同时配置无效session策略,配置参考如下:

.and().sessionManagement()
.invalidSessionStrategy(invalidSessionStrategy)

其中无效session的策略类需要实现InvalidSessionStrategy接口,参考如下:

@Component
public class TestInvalidSessionStrategy implements InvalidSessionStrategy {
@Override
public void onInvalidSessionDetected(HttpServletRequest httpServletRequest, HttpServletResponse response) throws IOException, ServletException {
response.setStatus(HttpStatus.HTTP_UNAUTHORIZED);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("当前登录已失效!请重新登录");
}
}

即可实现在session正常失效时,提示用户:“当前登录已失效!请重新登录”。

登录踢出的策略实现

在Security的配置文件中, configure(HttpSecurity http) 方法里,构建时增加上session管理配置,同时配置过期session策略,在上述的配置前提下,再新增配置项,配置参考如下:

.and().sessionManagement()
.invalidSessionStrategy(invalidSessionStrategy)
//配置session最大数量,设置为1,就只允许一个用户登录,就能够实现提出功能了
.maximumSessions(1)
//配置session过期策略
.expiredSessionStrategy(sessionExpiredStrategy)

其中过期session的策略类需要实现SessionInformationExpiredStrategy接口,参考如下:

@Component
public class TestSessionExpiredStrategy implements SessionInformationExpiredStrategy {


@Override
public void onExpiredSessionDetected(SessionInformationExpiredEvent sessionInformationExpiredEvent) throws IOException {
HttpServletResponse response = sessionInformationExpiredEvent.getResponse();
response.setStatus(HttpStatus.HTTP_UNAUTHORIZED);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("您的账号已经在别的地方登录!");
}
}

即可实现在登录踢出时,提示用户:“您的账号已经在别的地方登录!”。
————————————————
版权声明:本文为CSDN博主「绅士jiejie」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38106322/article/details/123949129

 

posted @ 2023-12-27 10:26  沧海一滴  阅读(433)  评论(0编辑  收藏  举报