为Spring Security应用添加无操作自动登出计时器
Spring纯Java配置实现无操作自动登出
要实现用户无活动自动登出,需要后端Session超时配置+前端无活动检测触发登出配合完成,以下是具体步骤:
一、后端Spring Security纯Java配置
在你的SecurityConfig类中补充Session管理与登出逻辑:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http // 保留你已有的登录、权限拦截等配置 .logout() .logoutUrl("/logout") // 定义登出接口路径 .logoutSuccessUrl("/login?logout") // 登出成功跳转至带提示的登录页 .invalidateHttpSession(true) // 登出时销毁Session .deleteCookies("JSESSIONID") // 删除会话Cookie .permitAll() .and() .sessionManagement() .invalidSessionUrl("/login?sessionExpired") // Session失效后的跳转地址 .maximumSessions(1) // 限制单用户仅一个有效会话 .expiredUrl("/login?sessionExpired"); // 会话过期后的跳转地址 } // 注册Session事件发布器,用于监听会话状态 @Bean public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() { return new ServletListenerRegistrationBean<>(new HttpSessionEventPublisher()); } }
同时在application.properties中配置Session超时时长(单位:秒):
server.servlet.session.timeout=1800 # 30分钟超时,可根据需求调整
二、前端无活动检测逻辑
在系统主页面(如首页、 dashboard)添加JavaScript,监听用户操作并触发超时登出:
// 设置无活动超时时间(毫秒,示例为30分钟) const INACTIVITY_TIMEOUT = 1800000; let timeoutTimer; // 重置超时计时器 function resetTimeout() { clearTimeout(timeoutTimer); timeoutTimer = setTimeout(triggerLogout, INACTIVITY_TIMEOUT); } // 触发登出操作 function triggerLogout() { window.location.href = '/logout'; } // 监听用户各类操作事件 document.addEventListener('mousemove', resetTimeout); document.addEventListener('keypress', resetTimeout); document.addEventListener('click', resetTimeout); document.addEventListener('scroll', resetTimeout); // 页面加载时启动计时器 window.onload = resetTimeout;
三、验证与注意事项
- 测试时可临时缩短超时时间(如30秒),快速验证功能有效性
- 确保
/logout接口已通过Security配置允许匿名访问 - 若使用AJAX请求接口,需在登出后手动处理页面跳转,避免无响应
内容的提问来源于stack exchange,提问作者Maulik Davra
相关产品推荐
相关产品推荐

