簡體   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