Jquery CakePHP ajax post不断返回400个错误请求

Jquery CakePHP ajax post不断返回400个错误请求,jquery,cakephp,post,Jquery,Cakephp,Post,我正在尝试使用ajax发布一个动作。GET请求工作正常,但当我尝试发布时,我在firebug中看到一个“400错误请求”,视图返回一个“黑洞”响应 以下是Jquery请求: $.ajax({ url:"/usermgmt/users/editUser", type:"POST", success:function(data) { alert('Wow this actu

我正在尝试使用ajax发布一个动作。GET请求工作正常,但当我尝试发布时,我在firebug中看到一个“400错误请求”,视图返回一个“黑洞”响应

以下是Jquery请求:

            $.ajax({
            url:"/usermgmt/users/editUser",
            type:"POST",
            success:function(data) {
                alert('Wow this actually worked');
                //ko.applyBindings(self);

            },
            error:function() {
                alert('This will never work');
            }
        });

这是因为Cake的安全设置还是我在这里遗漏了什么?

让舒尔成为您正在使用的editUser功能:

  public function beforeFilter(){
    parent::beforeFilter()
    $this->Auth->allow('editUser');
    }
在UsersController的内部


注意

防止表单篡改是安全组件提供的基本功能之一。只要它被启用,它将把所有的帖子都当作表单提交

常规的手工编码HTML表单在启用安全组件的情况下无法工作,因此JQuery生成的POST也无法工作。当然,您可以使用
$this->Security->validatePost=false
$this->Security->csrfCheck=false但随后您失去了安全组件提供的保护

为了保持安全组件正常运行,您需要使用CakePHP表单帮助程序来创建要通过ajax发布的表单。通过这种方式,
data[\u-Token][fields]
data[\u-Token][unlocked]
隐藏字段将使用其密钥生成:

<?php 
    echo $this->Form->create('Test',array('id'=>'testform'));
    echo $this->Form->input('Something');
    echo $this->Form->submit();
    echo $this->Form->end();
?> 
现在,如果您按下提交按钮,POST将成功

重要提示:由于表单帮助器的令牌只能与安全组件一起使用一次,因此此解决方案仅在您只打算每生成一页发布一次时有效。如果需要能够在页面重新加载之间多次发布同一表单,则在控制器开头添加安全组件时,需要执行以下操作:

public $components = array(
    'Security' => array(
        'csrfUseOnce' => false
    )
);

…这将允许令牌用于多个请求。它没有那么安全,但您可以将其与
csrfExpires
结合使用,以便令牌最终过期。所有这些都记录在。

FYI CakePHP 2.3及以上版本中,现在包括仅用于此目的的解除锁定操作,用于控制器或AppController中的beforeFilter

$this->Security->unlockedActions = array('ajaxAction');

发件人:

约瑟夫的回答对我来说遗漏了一个细节。我的表单和ajax调用在index.ctp中,调用了/controller/edit.ctp,因此我的$this->form->create调用需要“action”=>“/controller/edit”添加到其中。

我正在研究这个问题,我很确定是安全组件阻止了我:好吧,如果我用这个禁用跨站点安全性:$this->Security->csrfCheck=false;它起作用了。。。。。但显然这不是办法:)有什么想法吗?你能在/usermgmt/users/editUsers中发布代码吗?这是几个月前发布的,但以防万一你仍然在寻找答案:你真的试图通过ajax请求发布一些数据吗?如果是这样的话,你能更新这个问题来显示数据是什么样子的以及你是如何发布的吗?只是想补充一下,因为如果javascript修改了一个“隐藏”的输入字段,也会发现错误,因为标记会跟踪这些字段。如果不想禁用validatePost,只需将字段从隐藏更改为文本类型字段,然后通过css隐藏它们(显示:无)。这将允许您正确提交表单,即使javascript更改了您的输入字段。非常好且详细的回答,这帮助我解决了完全相同的问题,我需要一段时间才能确定它是安全组件+先生,给你一个!
public $components = array(
    'Security' => array(
        'csrfUseOnce' => false
    )
);
$this->Security->unlockedActions = array('ajaxAction');