【问题标题】:Expected CSRF token not found. Has your session expired?未找到预期的 CSRF 令牌。你的会话过期了吗?
【发布时间】:2016-03-13 01:11:39
【问题描述】:

我在 SE 中对此问题进行了研究,但没有找到解决问题的答案。

从我的问题来看,每次我在网络中退出会话并打开新标签,总是会触发这个错误。我认为会话管理不允许 csrf 令牌暴露在浏览器的另一个选项卡中。

当我在 chrome cookies 控制台中跟踪 JSESSIONID 时,它显示与正常成功登录相比没有给出响应,后者给出了 JSESSIONID 的响应。

这是我的登录页面表单:

<form name='loginForm' action="<c:url value='/login' />" method="post">
        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
        <div id="username_input">
            <div id="username_inputleft"></div>
            <div id="username_inputmiddle">                 
                <input type="text" name="username" id="url" placeholder="<spring:message code="login.name" />" >
                <img id="url_user" src="<c:url value="/resources/images/login/mailicon.png"/>" alt="">              
            </div>
            <div id="username_inputright"></div>
        </div>
        <div id="password_input">
            <div id="password_inputleft"></div>
            <div id="password_inputmiddle">                 
                <input type="password" name="password" id="url" placeholder="<spring:message code="login.password" />" >
                <img id="url_password" src="<c:url value="/resources/images/login/passicon.png"/>" alt="">              
            </div>
            <div id="password_inputright"></div>
        </div>
        <div id="submit">               
            <input type="image" src="<c:url value="/resources/images/login/submit_hover.png"/>" id="submit1"  value="Sign In" />                
            <input type="image" src="<c:url value="/resources/images/login/submit.png"/>" id="submit2"  value="Sign In"/>               
        </div>          
        </form>

我认为问题出在我的安全配置中的会话管理:

.sessionManagement()
        .sessionFixation()
        .newSession()
        .maximumSessions( 1 );

但不知何故我无法解决问题。我希望有人可以提供帮助。

更新:

我使用此链接退出:

<a href="<c:url value="/logout" />">
 <spring:url value="/resources/images/logout.jpg" var="logoutimg" />
 <img src="${logoutimg}">
 <spring:url value="/resources/images/logout_txt.jpg" var="logouttxtimg" />
 <img class="hidden-xs" src="${logouttxtimg}" />
</a>

【问题讨论】:

  • 另一个选项卡不是新会话,而是同一个会话。另外你是如何注销的?显示您正在使用的链接/表单。
  • 我认为新标签也不会影响会话,但只有当我在新标签中打开相同的链接时它才不起作用,它在同一个标​​签上正常工作
  • 您将需要一个新的浏览器,否则所有内容都将被共享。因此,您需要例如使用 Chrome 和 Firefox(或先关闭 chrome)。打开一个新标签,或者点击一个链接,这不是一个新的浏览器。
  • 使用 CSFR 时,您无法使用链接注销,您需要在注销链接中发布表单以包含 CSFR 令牌。
  • 是的,在新浏览器中打开,或者重新启动当前浏览器也可以正常工作,这是否意味着我不能使用具有相同 URL 的 2 个选项卡,并且总是需要重新启动或打开新浏览器才能使其工作?

标签: java spring session spring-security session-fixation


【解决方案1】:

出于某种原因,我们需要使用 /logout 或 /j_spring_security_logout 来注销当前用户。如果我们使用另一种方法以编程方式注销,除非我使用提供的 url,否则注销过程将不会完成。感谢帮助。如果有人提出了以编程方式完全注销而不影响弹簧安全性的解决方案,请告诉我。谢谢

【讨论】:

    【解决方案2】:

    在你的控制器中试试这个

    @RequestMapping("/Logout")
    public ModelAndView processLogout(HttpServletRequest request, HttpServletResponse response) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null) {
            new SecurityContextLogoutHandler().logout(request, response, auth);
        }
        mv = new ModelAndView();
        mv.setViewName("Login");
        return mv;
    }
    

    然后在你的登录页面插入

    <input type="hidden" name="${_csrf.parameterName}"
                        value="${_csrf.token}" />
    

    不要忘记将此添加到您的安全配置中

    <security:logout delete-cookies="JSESSIONID"
            logout-success-url='/login?logout' logout-url="/Logout"
            invalidate-session="true" />
    

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 2016-03-21
      • 2015-03-24
      • 2019-12-17
      • 2017-05-02
      • 2016-05-24
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      相关资源
      最近更新 更多