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"%>







...
上述代码中,
等同于:
 
  

而,之所以使用spring的替代

标签,是因为spring的标签可以自动将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:


对每个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);
                                  }
        ); 
});


你可能感兴趣的:(spring,security,csrf)