繁体   English   中英

找不到预期的CSRF令牌。 您的会话是否已过期?

[英]Expected CSRF token not found. Has your session expired?

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

从我的问题来看,每次我注销Web会话并打开新标签时 ,都会触发此错误。 我认为会话管理不允许在浏览器的另一个选项卡中公开csrf令牌。

当我在chrome cookie控制台中跟踪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>

由于某些原因,我们需要使用/ logout或/ j_spring_security_logout来注销当前用户。 如果我们使用其他方法以编程方式注销,那么除非使用提供的URL,否则注销过程将无法完成。 感谢帮助。 如果有人提出了在不影响弹簧安全性的情况下完全以编程方式注销的解决方案,请告诉我。 谢谢

在您的控制器中尝试

@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" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM