我在SE中对此问题进行了研究,但没有找到解决问题的答案。
从我的问题来看,每次我在web中注销会话并打开新选项卡时,都会触发此错误。我认为会话管理不允许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>
由于某些原因,我们需要使用/logoout或/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" />