自己写的一个表单传给控制器,点了提交之后发现如下问题
后面查阅资料是因为表单被yii2的csrf验证拦截了,毕竟是我自己写的表单,所以只需要屏蔽csrf验证这个问题就解决了。
这里提供两个方法来屏蔽csrf验证。
1.在直接在当前的的控制器里声明 $enableCsrfValidation=false;
但该方法将屏蔽该控制器下的所有Csrf验证。
2.单独写一个行为(NoCsrf.php),之后在当前控制器下加载该行为,就可以实现在某个action下屏蔽csrf验证了。
NoCsrf.php
use yii;
use yii\base\ActionEvent;
use yii\base\Behavior;
use yii\web\Controller;
class NoCsrf extends Behavior{
public $actions = [];
public $controller;
public function events(){
return [Controller::EVENT_BEFORE_ACTION => 'beforeAction'];
}
public function beforeAction($event){
$action = $event->action->id;
if(in_array($action, $this->actions)){
$this->controller->enableCsrfValidation = false;
}
}
}在当前控制器里加载该行为:
public function behaviors()
{
return [
'csrf' => [
'class' => NoCsrf::className(),
'controller' => $this,
'actions' => [
'actionName'
]
]
];
}这样就可以实现某个action下屏蔽csrf验证。
本文介绍如何在Yii2框架中解决表单提交被CSRF验证拦截的问题,提供了两种屏蔽CSRF验证的方法:一种是在控制器中设置$enableCsrfValidation为false;另一种是通过创建并应用NoCsrf行为来仅针对特定的action禁用CSRF验证。
2373

被折叠的 条评论
为什么被折叠?



