如何通过Jqgrig请求发送Spring Security csrf

时间:2017-12-24 09:38:45

标签: jquery spring-security jqgrid

我正在使用Jqrgrid和Spring Security但我如何使用JQGrid请求发送CSRF

1 个答案:

答案 0 :(得分:0)

我不是Spring开发人员。您的问题的解决方案取决于您获取CSRF令牌的方式。似乎有两种主要方式:使用<meta> content等于${_csrf.token}或使用getCookie('csrftoken')

让我们按照the part(或this one)春季文档进行操作,然后添加<meta>元素_csrf_csrf_header,如下所示

<!DOCTYPE html>
<html>
<head>
    <meta name="_csrf" content="${_csrf.token}"/>
    <!-- default header name is X-CSRF-TOKEN -->
    <meta name="_csrf_header" content="${_csrf.headerName}"/>
    <!-- ... -->
</head>
<!-- ... -->

然后我们可以在beforeSend方法的jQuery.ajax回调中设置Ajax请求的安全令牌:

$.ajax({
    url: "someUrl",
    ...
    beforeSend: function(jqXHR) { 
        xhr.setRequestHeader(
            $("meta[name='_csrf_header']").attr("content"),
            $("meta[name='_csrf']").attr("content")
        );
    }
});

另一方面,jqGrid 已在内部发出Ajax请求。因此,您必须使用 jqGrid回调来通知jqGrid在底层Ajax请求中执行相同操作。因此,应该使用jqGrid的loadBeforeSend回调:

loadBeforeSend: function(jqXHR) {
    var header = $("meta[name='_csrf_header']").attr("content"),
        token = $("meta[name='_csrf']").attr("content");
    jqXHR.setRequestHeader(header, token);
}

如果你以后要实现jqGrid数据的编辑,那么你必须在其他回调中做一些事情,这允许在编辑期间调用setRequestHeader jQuery.ajax回调内的beforeSend网格。