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); } ); });
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。