牛骨文教育服务平台(让学习变的简单)
博文笔记

spring security的csrf防御机制在ajax中的应用

创建时间:2015-11-27 投稿人: 浏览次数:6122

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);
                                  }
        ); 
});


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。