YII 2.0 Bad Request (#400)

post提交表单的时候出现在这个错误是因为Yii2.0默认开启了_crsf的验证

可以在控制器里局部禁用
public $enableCsrfValidation = false ->覆盖父类的属性

也可以在配置文件中全局禁用
 ‘components‘ => [
        ‘request‘ => [
            /**
            /*!!! insert a secret key in the following (if it is empty) - this is required by    
            /*cookie validation
            /**
            ‘cookieValidationKey‘ => ‘83r5HbITBiMfmiYPOZFdL-raVp4O1VV4‘,
            ‘enableCookieValidation‘ => false,
            ‘enableCsrfValidation‘ => false,
        ]

当然,我们并不建意这样做。

如果是用ActiveForm生成的表单,用传统的POST提交这里是不会有问题的。

我们可以来看看YII2.0的源码。

\yii\widgets\ActiveForm
这个类里面有一个run方法
/**
     * Runs the widget.
     * This registers the necessary javascript code and renders the form close tag.
     * @throws InvalidCallException if `beginField()` and `endField()` calls are not matching
     */
    public function run()
    {
        if (!empty($this->_fields)) {
            throw new InvalidCallException(‘Each beginField() should have a matching endField() call.‘);
        }

        $content = ob_get_clean();
        echo Html::beginForm($this->action, $this->method, $this->options);
        echo $content;

        if ($this->enableClientScript) {
            $id = $this->options[‘id‘];
            $options = Json::htmlEncode($this->getClientOptions());
            $attributes = Json::htmlEncode($this->attributes);
            $view = $this->getView();
            ActiveFormAsset::register($view);
            $view->registerJs("jQuery(‘#$id‘).yiiActiveForm($attributes, $options);");
        }

        echo Html::endForm();
    }
可以看到 echo Html::beginForm($this->action, $this->method, $this->options);这样一句。
在Html::beginForm()这个方法里面
if ($csrf && $request->enableCsrfValidation && strcasecmp($method, ‘post‘) === 0) {
    $hiddenInputs[] = static::hiddenInput($request->csrfParam, $request->getCsrfToken());
}
这样一段代码就是在表单写入了一个hide input加入了_csrf
如果不是用的ActiveForm则需要手动加入:
<input type="hidden" name="<?php echo Yii::$app->request->csrfParam;?>" value="<?php echo Yii::$app->request->getCsrfToken();?>">

如果是ajax post则要在data后面也带上这个参数

YII2.0 标准写法

<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <?= Html::csrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
表单
<?php $form = ActiveForm::begin([‘id‘ => ‘login-form‘]); ?>
<?php ActiveForm::end(); ?>
时间: 2024-11-03 21:54:31

YII 2.0 Bad Request (#400)的相关文章

Yii Framework2.0开发教程(5)数据库mysql性能

继续<Yii Framework2.0开发教程(3)数据库mysql入门> 首先给予一定的尊重yii2数据库支持引进 Yii 基于 PHP's PDO一个成熟的数据库访问层的建立.它提供了一个统一的 API 并且克服了许多不同的 DBMS 违禁使用. Yii 默认支持下面 DBMS : MySQL MariaDB SQLite PostgreSQL CUBRID: version 9.1.0 or higher. Oracle MSSQL: version 2012 或更高版本号,如需使用 L

使用nginx部署Yii 2.0\yii-basic-app-2.0.5

nginx.conf #user nobody;worker_processes 1; #error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024;} http { include mime.types; default_type application/octet-s

Yii 2.0.6 - 从入口到Action执行

defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev'); require(__DIR__ . '/../vendor/autoload.php'); // 注册 Composer 加载器 Yii::setAlias('@common', dirname(__DIR__)); // 注册别名 { \yii\BaseYii::setAlias($alias, $

Yii Framework2.0开发教程(8)输入验证

validate() 方法,在幕后为执行验证操作.先看一个简单的例子,例子的代码在<Yii Framework2.0开发教程(2)使用表单Form>. 类ZhyoulunController中函数actionEntry() ,其中有一句$model->validate(),就是来判断输入的名字和电子邮件是否正确. 修改models/EntryForm.php <?php namespace app\models; use yii\base\Model; class EntryFor

[Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]

Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如果有理解不当敬请指正,欢迎大家把自己的方法拿出来分享.我们希望被引入的类应该达成一下两点: 在应用中的任这里输入代码意位置可以使用该类名或命名空间,而不用显式调用require()/include(). 利用Yii的autoloader,仅在类被调用时加载,以遵循Yii按需加载的原则,节省资源. 我

iOS 请求出现 &quot;Request failed: bad request (400)&quot;

主要出现如下错误: 请求失败-Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: bad request (400)" UserInfo={com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x7cec30d0> { URL: https://api.weibo.co

Yii Framework2.0开发教程(5)数据库mysql函数

继续<Yii Framework2.0开发教程(3)数据库mysql入门> 首先给一些关于yii2数据库支持的介绍 Yii 基于 PHP's PDO建立了一个成熟的数据库访问层.它提供统一的 API 并解决了一些不同 DBMS 产生的使用不利. Yii 默认支持以下 DBMS : MySQL MariaDB SQLite PostgreSQL CUBRID: version 9.1.0 or higher. Oracle MSSQL: version 2012 或更高版本,如需使用 LIMIT

Yii框架用ajax提交表单时候报错Bad Request (#400): Unable to verify your data submission.

提交表单报400错误,提示 "您提交的数据无法验证"原来是csrf验证的问题,因为表单是自己写的,在Yii框架中,为了防止csrf攻击,对post的表单数据封装了CSRF令牌验证.解决办法关闭csrf验证 frontend/config/main-local.PHP中 在配置文件中关闭 $config = [ 'components' => [ 'request' => [ // !!! insert a secret key in the following (if it

Yii Framework2.0开发教程(3)数据库mysql入门

沿用教程(2)的代码 第一步.在本地mysql数据库中新建数据库zhyoulun 第二步.在数据库中新建表并插入若干条数据 CREATE TABLE `country` ( `code` CHAR(2) NOT NULL PRIMARY KEY, `name` CHAR(52) NOT NULL, `population` INT(11) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `country