下面的办法将更加优化:
- 坚持用户登录时
- 运行一个cron每5秒(根据您的要求)检查过期的会话(即t他会话在阈值时间之后仍然存在)并将其标记为过期。
- (可选)发布一条消息给Faye,该消息应该通知UI(UI应实现对Faye的订阅)会话已过期。
你可以使用这样的到期令牌:
public void expireToken (HttpServletRequest request, HttpServletResponse response){
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null){
SecurityContextHolder.getContext().setAuthentication(null);
}
}
要获取所有当前会话,你可以使用以下命令:
public class UserController {
@Autowired
private SessionRegistry sessionRegistry;
public void listLoggedInUsers() {
final List<Object> allPrincipals = sessionRegistry.getAllPrincipals();
for(final Object principal : allPrincipals) {
if(principal instanceof SecurityUser) {
final SecurityUser user = (SecurityUser) principal;
// if currentTime > logInTime + threshold time
expireToken();
}
}
}
}
注:我个人避免从前端轮询后端,因为它听起来不是一个最佳方法
你看过例子spring jdb c会话。 https://github.com/spring-projects/spring-session/blob/master/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/JdbcOperationsSessionRepository.java 在那里你可以配置最大空闲超时。 –
春季安全中是否有任何选项可以创建自定义会话? –
也许这两个组合:https://stackoverflow.com/questions/5385175/setting-session-timeout-period-with-spring-security-3-0(如何设置超时)和https:// stackoverflow。 com/questions/7342936/how-to-get-session-information-in-spring-mvc-3(如何从控制器获取会话) – Brian