【问题标题】:Session atributes missing from spring session when setting inside HttpSessionListener在 HttpSessionListener 中设置时,spring 会话中缺少会话属性
【发布时间】:2021-02-03 11:41:23
【问题描述】:
在基于 servlet 的应用程序中,我想使用 Spring Session Data Redis 进行会话复制。一切正常,但为了 csrf 安全性,我们使用的是 owasp scrfgaurd,其中该流会话令牌将设置为 HttpSessionListener。验证时令牌丢失。
我尝试创建独立代码来重现问题。我创建了 SampleHttpListener 并为会话设置了一些属性,但这些值我无法在 servlet 级别看到。
请告诉我我缺少的任何内容或此场景的任何其他方法。
我在这里添加了源代码
https://github.com/surya0420/SpringSession
【问题讨论】:
标签:
servlets
spring-session
【解决方案1】:
public class CsrfGuardHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
CsrfGuard csrfGuard = CsrfGuard.getInstance();
csrfGuard.updateToken(session);
if(session.getServletContext()!=null){
session.getServletContext().setAttribute(OWASP_CSRFTOKEN,session.getAttribute(OWASP_CSRFTOKEN));
}
}
由于缺少在 HttpSessionListener 级别设置的会话属性,所以我将其设置为
session.getServletContext().setAttribute(OWASP_CSRFTOKEN,session.getAttribute(OWASP_CSRFTOKEN));
创建会话后,我在过滤器级别设置属性,如下所示在过滤器级别
if(((HttpServletRequest) request).getSession().getAttribute(OWASP_CSRFTOKEN) == null) {
((HttpServletRequest) request).getSession().setAttribute(OWASP_CSRFTOKEN, request.getServletContext().getAttribute(OWASP_CSRFTOKEN));
}