SpringBoot 中 session 监听配置
1、注册自定义sessionListener 到 SessionManger中,此方式是 代码方式配置,也可以用 xml,看个人习惯
@Configuration
@Order(2)
public class ShiroConfiguration {
@Bean
public SessionManager sessionManager() {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setSessionDAO(redisSessionDAO());
//设置session失效时间
sessionManager.setGlobalSessionTimeout(30*60*1000L);
//删除过期的session
sessionManager.setDeleteInvalidSessions(true);
//注册自定义session监听
Collection<SessionListener> listeners = new ArrayList<SessionListener>();
listeners.add(new ShiroSessionListener());
sessionManager.setSessionListeners(listeners);
return sessionManager;
}
2、编写session监听
@Component
@WebListener
public class ShiroSessionListener extends SessionListenerAdapter {
Logger logger= LoggerFactory.getLogger(ShiroSessionListener.class);
@Override
public void onStart(Session session) {
logger.info("session创建:" + session.getId());
}
@Override
public void onStop(Session session) {
logger.info("session停止:" + session.getId());
//清空登录ip
SpringUtil.getBean(UserService.class).updateLoginState(Integer.parseInt(String.valueOf(session.getAttribute("userId"))),null);
//清空redis中sessionId
if(!StringUtils.isEmpty(String.valueOf(session.getId()))){
SpringUtil.getBean(RedisTemplate.class).delete(String.valueOf(session.getId()));
}
}
@Override
public void onExpiration(Session session) {
logger.info("session过期:" + session.getId());
//清空登录ip
SpringUtil.getBean(UserService.class).updateLoginState(Integer.parseInt(String.valueOf(session.getAttribute("userId"))),null);
//清空redis中sessionId
if(!StringUtils.isEmpty(String.valueOf(session.getId()))){
SpringUtil.getBean(RedisTemplate.class).delete(String.valueOf(session.getId()));
}
}
}