我正在使用Jqrgrid和Spring Security但我如何使用JQGrid请求发送CSRF
答案 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
网格。