【发布时间】:2024-04-30 18:15:01
【问题描述】:
我正在我的项目中实现 Spring Security,并使用 mysql 数据库来存储会话。一切正常,但是当用户注销时,它的会话也会从我不想要的数据库中删除。我只希望会话无效但不从数据库中删除。 在调试时,我发现:
public void logout(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) {
Assert.notNull(request, "HttpServletRequest required");
if (invalidateHttpSession) {
HttpSession session = request.getSession(false);
if (session != null) {
logger.debug("Invalidating session: " + session.getId());
**session.invalidate();**
}
}
if (clearAuthentication) {
SecurityContext context = SecurityContextHolder.getContext();
context.setAuthentication(null);
}
SecurityContextHolder.clearContext();
}
此代码来自 SecurityContextLogoutHandler 类。
进一步,代码执行进入:
private final class HttpSessionWrapper extends HttpSessionAdapter<S> {
HttpSessionWrapper(S session, ServletContext servletContext) {
super(session, servletContext);
}
@Override
public void invalidate() {
super.invalidate();
SessionRepositoryRequestWrapper.this.requestedSessionInvalidated = true;
setCurrentSession(null);
clearRequestedSessionCache();
**SessionRepositoryFilter.this.sessionRepository.deleteById(getId());**
}
}
函数的最后一行删除了我不想要的会话。
我的问题是,当用户注销时,我是否可以阻止 spring security 从数据库中删除会话,或者这就是 spring security 的工作方式?
【问题讨论】:
-
您不应该这样做,因为删除会话会使它失效。为什么要将会话数据保留在数据库中?因此,您可能还有另一个要完成的用例,这是您应该提出的实际问题。
标签: spring spring-boot spring-security spring-session