1.创建专门的session监听器HttpSessionListener
@WebListener
@Slf4j
public class SessionListener implements HttpSessionListener {
@Override
public void sessionDestroyed(HttpSessionEvent event) {
log.info(“session销毁中!”);
HttpSession session = event.getSession();
log.info(“session为:” + session);
UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) ((SecurityContextImpl) session.getAttribute(“SPRING_SECURITY_CONTEXT”)).getAuthentication();
log.info(“token为:” + token);
Long userId = ((SysUser) token.getPrincipal()).getId();
log.info(“userId为:” + userId);
String ip = ((WebAuthenticationDetails) token.getDetails()).getRemoteAddress();
if (ip.equals(“127.0.0.1”) || ip.equals(“0:0:0:0:0:0:0:1”)) {
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
ip = inet.getHostAddress();
}
log.info(“ip为:” + ip);
//获取sysUserDao实例
SysUserDao sysUserDao = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext()).getBean(SysUserDao.class);
sysUserDao.updateAiLoginOutTime(userId, ip);
log.info(“用户id为:” + userId + “,ip为:” + ip + “的session已销毁!”);
}
@Override
public void sessionCreated(HttpSessionEvent event) {
}
}
2.在WebMvcConfigurer中注册配置
@Configuration
public class MVCConfigurer implements WebMvcConfigurer {
@Resource
private RedisTemplate<String,Object> redisTemplate;
@Resource
private ObjectMapper jacksonObjectMapper;
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false)
.setUseTrailingSlashMatch(true);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//registry.addInterceptor(vrAPPInterceptor()).addPathPatterns("/app/**").excludePathPatterns("/app/userCenter/getValidCode");
registry.addInterceptor(new ManageInterceptor()).addPathPatterns("/manage/**");
registry.addInterceptor(new AppInterceptor(jacksonObjectMapper, redisTemplate)).addPathPatterns("/app/**").excludePathPatterns("/app/login", "/app/versionupdate/getAppVersion");
}
//注册session监听器
@Bean
public ServletListenerRegistrationBean<SessionListener> servletListenerRegistrationBean() {
ServletListenerRegistrationBean<SessionListener> slrBean = new ServletListenerRegistrationBean<SessionListener>();
slrBean.setListener(new SessionListener());
return slrBean;
}
}
3.监听器里面无法直接调用spring管理bean
//获取sysUserDao实例
SysUserDao sysUserDao = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext()).getBean(SysUserDao.class);