前言
最近相对较忙,没有更新博客,正值假期,赶紧抽空写两篇。也是遇到的项目上的需求:管理员变更了用户的权限,但是用户如果系统在线的话,有些权限功能仍旧可以使用。对此,强制用户下线的需求来了。括弧:由于系统预期为一对一的单服务系统,没有使用redis做缓存。所以对强制用户下线的功能带来了一些麻烦。
设计思路
- 对于系统的用户信息,既然没用redis做缓存,我想到了对session下手,用session存储用户信息。
- 了解springsecurity对session的操作
查找资料
- 网上的解决办法
- 我发现这个bean类并不能取到session,打印的session永远是一个空的数组。
- 于是,通过查阅资料,springsecurity通过对用户的认证之后会销毁
session的信息。也就是说,想要取到SecurityContextHolder,必须是在过滤器链上的操作。想要单独使用,没有办法取到用户的信息。
自己手写缓存过滤器
HttpSession监听器
需要在安全配置类中注入该bean类
- 注入该bean类
- 这个时候,我们就可以随时监听session的创建,移除,和销毁的事件了,如下:
@WebListener
@Component
@Slf4j
public class SessionListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
log.info("--attributeAdded--");
log.info("key----:"+httpSessionBindingEvent.getName());
log.info("value---:"+httpSessionBindingEvent.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
log.info("--attributeRemoved--");
log.info("key----:"+httpSessionBindingEvent.getName());
log.info("value---:"+httpSessionBindingEvent.getValue());
}
@Override
pu