spring security的csrf防御机制在ajax中的应用
spring security的csrf防御功能:
在jsp中使用如下代码:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <html> <head> <sec:csrfMetaTags/> </head> <body> <form:form> <table id="user" action="" method="post"> ... </table> </form:form> </body> </html>上述代码中,
<sec:csrfMetaTags/>等同于:
<head><meta name="_csrf" content="${_csrf.token}"/><meta name="_csrf_header" content="${_csrf.headerName}"/></head>
而,之所以使用spring的<form:form>替代<form>标签,是因为spring的<form:form>标签可以自动将token以hidden类型添加到提交的数据当中
在js代码中,使用如下方式:var csrfParameter = $("meta[name="_csrf_parameter"]").attr("content");
var csrfHeader = $("meta[name="_csrf_header"]").attr("content");
var csrfToken = $("meta[name="_csrf"]").attr("content");
var csrf_ = {};
csrf_[csrfParameter] = csrfToken;即可获取到csrf的Token的相关参数。
1.如果使用datagrid加载表格数据,可以参考:
$("#user").datagrid({
queryParams:csrf_
});这样即可将csrf相关参数添加到请求中。2.普通的ajax请求可以参考:
var header = $("meta[name="_csrf_header"]").attr("content");
var token = $("meta[name="_csrf"]").attr("content");
$.ajax({
url: "/test",
type: "POST",
beforeSend: function(xhr){
xhr.setRequestHeader(header, token);
},
success: function(data) {
console.log(data);
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(xhr.status + ": " + thrownError);
}
});3.或者参考:
var token = $("meta[name="_csrf"]").attr("content");
var header = $("meta[name="_csrf_header"]").attr("content");
$(document).ajaxSend(function(e, xhr, options) {
xhr.setRequestHeader(header, token);
});4.还可以直接在action的参数中加入token:
<form:form action="./upload?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">对每个ajax请求都设置token会十分繁琐,因此可以参考在ajaxSetup中统一设置:
$(function(){
var token = $("meta[name="_csrf"]").attr("content");
var header = $("meta[name="_csrf_header"]").attr("content");
$.ajaxSetup({
beforeSend: function (xhr) {
xhr.setRequestHeader(header, token);
}
);
});声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了
