早上好
我是java和spring的新手,目前在我的一个应用程序中实现了Spring安全性,该应用程序使用logout-url = /logout
配置以及logoutSuccessHandler来允许用户单击注销按钮以注销。我还在javascript中从客户端实现了心跳模式,该模式将使服务器知道该应用程序已在浏览器中打开。它每5分钟向服务器发布一条消息。如果浏览器已关闭,并且服务器未从浏览器收到消息,表明该服务器仍在运行,则我想强制从控制器调用注销URL。我该怎么办呢?我尝试使用HttpServletRequest实现HTTP请求,但这似乎不起作用。
答案 0 :(得分:0)
您可能是从错误的角度接近这个问题。听起来您想将最大会话超时设置为默认值以外的其他值。假设您正在servlet容器上运行,则可以在web.xml guide中对其进行配置。
如果用户在超时期间未与您的服务器进行任何活动,则他们的会话将过期。
如果需要对会话破坏进行操作,则可以按照link
中的说明添加HttpSessionListener。答案 1 :(得分:0)
您可以使用Scheduler,它会按特定间隔检查从浏览器更新的值。 您可以在本地注销服务。正如CollinD所提到的,您不需要Httprequest。 祝你好运。
答案 2 :(得分:0)
这是我过去创建的一项服务,用于在删除用户的访问权限时立即强制处理无效会话。
@Service
public class SecurityServiceImpl implements SecurityService {
private SessionRegistry sessionRegistry;
@Autowired
public SecurityServiceImpl(SessionRegistry sessionRegistry) {
Assert.notNull(sessionRegistry, "This implementation of SecurityService requires a SessionRegistry");
this.sessionRegistry = sessionRegistry;
}
@Override
public Integer expireUserSessions(User user) {
int result = 0;
Set<SessionInformation> sessionsToDestroy = new HashSet<>();
sessionRegistry.getAllPrincipals().forEach(principal -> {
if (principal instanceof UserDetails) {
UserDetails current = (UserDetails) principal;
if (current.getUsername().equals(user.getEmail())) {
sessionsToDestroy.addAll(sessionRegistry.getAllSessions(current, false));
}
}
});
for (SessionInformation session : sessionsToDestroy) {
result++;
session.expireNow();
}
return result;
}
}
由于User
是我的实体类之一,显然,用于选择会话的特定逻辑会有所不同。