【问题标题】: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));
            }
    

    【讨论】:

      猜你喜欢
      • 2012-04-07
      • 2018-08-26
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 2012-08-18
      • 2013-09-10
      相关资源
      最近更新 更多