我正在使用Codeigniter和jqgrid来构建应用程序。我最近出于安全原因启用了Codeigniter的内置CSRF保护,并且它破坏了jqgrid的一些东西。我已经能够在jqgrid实例化时传递csrf令牌,所以我的所有数据都加载(通过将csrf令牌添加到postData),但是现在我编辑一个单元格时出现500错误,因为csrf令牌不存在通过。我可以通过每次编辑单元格时查看发布数据来验证这一点。我读了几个地方,editData是我想要的,但在那里添加令牌似乎没有在编辑ajax请求中传递它。有什么想法吗?
$("#cust_grid").jqGrid({
url:'/ajax/grid',
datatype: 'xml',
mtype: 'POST',
postData: {<?php echo $this->security->get_csrf_token_name().":'".$this->security->get_csrf_hash()."'"; ?>},
editData: {<?php echo $this->security->get_csrf_token_name().":'".$this->security->get_csrf_hash()."'"; ?>},
colNames:['Name1', 'Name2'],
colModel :[
{name:'name1', index:'name1', width:55, search: true},
{name:'name2', index:'name2', width:110, search: true},
],
pager: '#pager',
rowNum:25,
rowList:[10,25,50,100],
sortname: 'name1',
sortorder: 'asc',
viewrecords: true,
gridview: true,
caption: 'Customers',
height: 600,
width: 1200,
shrinkToFit: false,
altRows: true,
cellEdit: true,
cellsubmit: "remote",
cellurl: "/ajax/editCell",
},
{}
);
答案 0 :(得分:0)
似乎你可以像我描述here一样解决问题。主要区别在于您使用cell editing而不是form editing。因此,您应该使用ajaxCellOptions
代替ajaxEditOptions
:
ajaxCellOptions: {
loadBeforeSend: function(jqXHR) {
// you should modify the next line to get the CSRF tocken
// in any way (for example $('meta[name=csrf]').attr('content')
// if you have <meta name="csrf" content="abcdefjklmnopqrstuvwxyz="/>)
var csrf_token = '<%= token_value %>'; // any way to get
jqXHR.setRequestHeader('X-CSRF-Token', csrf_token);
}
}
答案 1 :(得分:0)
我最终找到了问题的另一种解决方案。我正在调查另一个答案中发布的单元格编辑链接,我看到了beforeSubmitCell选项。如果从该函数返回json数据,则每次编辑单元格时都会将其附加到post数据。所以我需要做的就是添加一个选项:
beforeSubmitCell: function (rowid,celname,value,iRow,iCol) {
return {<?php echo $this->security->get_csrf_token_name().":'".$this->security->get_csrf_hash()."'";?>}
},
答案 2 :(得分:0)
我尝试后没有回答问题。然后我找到了将CSRF Token从Jqgrid内联编辑传递到Django的解决方案:
onSelectRow: function(id){
if(id && id!==lastSel){
$(selector).restoreRow(lastSel);
lastSel=id;
}
var editparameters = {
extraparam: {csrfmiddlewaretoken: $('.token-data').data('token')},
keys: true,
};
$(selector).jqGrid('editRow', id, editparameters);
}
用法示例: http://yodi.polatic.me/jqgrid-inline-editing-integration-with-django-send-csrf-token/