当我从Spring 3.1.1.RELEASE迁移到4.0.2 RELEASE时,我不得不对spring安全上下文进行一些更改。
除了POST退出请求外,几乎所有内容都可以。
我可以让整行成为form method =“POST”action =“logout”但是我必须处理提交,这是完全不同的造型然后我们需要的。 我尝试通过ajax发送带有csrf数据的注销请求但没有成功。 任何帮助是极大的赞赏。附:禁用csrf不是一种选择。
<!-- JSP -->
<meta name="_csrf" content="${_csrf.token}"/>
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" content="${_csrf.headerName}"/>
<!--Anchor -->
<a id="loggg" href="logout">Logout1</a>
<!-- jquery -->
$("#loggg").click(function(e){
e.preventDefault();
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$.ajax({
url : "logout",
method : "POST",
data :token ,
success : function(data) {
console.log("clicked");
},
error : function(data) {
console.log(data);
}
});
})
FireBug开发者控制台返回:
403 Forbidden 2ms
"NetworkError: 403 Forbidden - http://localhost:8081/nekretnine/logout"
Object { readyState=4, responseText="<!DOCTYPE html><html>
<he...EASE</h3></body></html>", status=403, more...}
答案 0 :(得分:1)
如果 login 是来自同一页面的AJAX请求,则会更改服务器中的令牌。在登录和注销等事件中的Spring Security changes the token。
因此,页面中的令牌不再有效。
如果情况确实如此,一种方法是在将令牌作为cookie附加过滤器之后使用GET请求获取新令牌,如here所述。
This也可能会有所帮助。
答案 1 :(得分:1)
我设法部分解决了这个问题。这个答案适用于那些可能遇到同样问题的人,就像我从Spring Security 3.1.1迁移到Spring security 4.0.2时那样。
JSP
<meta name="_csrf" content="${_csrf.token}"/>
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" content="${_csrf.headerName}"/>
锚
<a id="loggg" href="logout">Logout1</a>
Jquery的
$("#loggg").click(function(e){
e.preventDefault();
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$.ajax({
url : 'logout',
type : 'POST',
data: token,
beforeSend:function(xhr){
xhr.setRequestHeader(header, token);
},
success : function(data) {
window.location ="/home"; here is the only problem, for some reason after logging out page doesnt refresh and i can still see myself logged in. Then i usually just press f5 and i am logged out.
},
error : function(data) {
console.log(data);
}
});
})
当我从Spring security 3更改为Spring Security 4时,我注意到几个问题。 以下是一些:
属性不再是j.username i j.password而是use- username password
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
表单,或者如果你使用spring表单,将自动添加csrf.token。你也可以用
你需要添加这些过滤器(你必须在Spring安全过滤器之前添加它们)
<filter>
<display-name>springMultipartFilter</display-name>
<filter-name>springMultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>springMultipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
您可能正在使用multipartResolver解析器bean,您需要将其更改为
<beans:bean id="filterMultipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="maxUploadSize" value="-1" />
此外,如果您已经完成了所有这些并且仍然无法使用commons-fileUpload上传文件,那么您(就像我自己)可能会将filterMultyPartResolver放在servlet-context中,这在以前的版本中运行得很好,现在没有编译错误你最终会走在一条不知道该做什么的死胡同。解决方案很简单,只需将bean移动到root-context.xml和voala!一切都很完美。