0

我正在使用 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",
},
{}
);
4

3 回答 3

0

似乎您可以按照我在此处描述的大部分方式解决问题。主要区别在于您使用单元格编辑而不是表单编辑。所以你应该使用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);
    }
}
于 2012-09-08T12:40:22.363 回答
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()."'";?>} 
},
于 2012-09-10T22:54:35.577 回答
0

我试过后没有答案。然后我找到了通过使用以下方法将 CSRF 令牌从 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/

于 2015-04-03T08:04:59.183 回答