最近一直出现这样的错误,一直在查找原因,偶然看到一篇解决的文章,分享给大家看看。
第一种解决办法是关闭Csrf
1
2
3
|
public function init(){
$this ->enableCsrfValidation = false;
}
|
第二种解决办法是在form表单中加入隐藏域
<input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">
第三种解决办法是在AJAX中加入_csrf字段
1
2
3
4
5
6
7
8
|
var csrfToken = $( 'meta[name="csrf-token"]' ).attr( "content" );
$.ajax({
type: 'POST' ,
url: url,
data: {_csrf:csrfToken},
success: success,
dataType: dataType
});
|
Yii这个匹配的过程和Yii::$app->request->csrfToken 这个值存储位置说明:
存储位置
1
2
3
4
5
6
7
|
protected function createCsrfCookie( $token )
{
$options = $this ->csrfCookie;
$options [ 'name' ] = $this ->csrfParam;
$options [ 'value' ] = $token ;
return new Cookie( $options );
}
|
校验方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public function validateCsrfToken( $token = null)
{
$method = $this ->getMethod();
// only validate CSRF token on non-"safe" methods http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1
if (! $this ->enableCsrfValidation || in_array( $method , [ 'GET' , 'HEAD' , 'OPTIONS' ], true)) {
return true;
}
$trueToken = $this ->loadCsrfToken();
if ( $token !== null) {
return $this ->validateCsrfTokenInternal( $token , $trueToken );
} else {
return $this ->validateCsrfTokenInternal( $this ->getBodyParam( $this ->csrfParam), $trueToken )
|| $this ->validateCsrfTokenInternal( $this ->getCsrfTokenFromHeader(), $trueToken );
}
}
|
以上所述就是本文的全部内容了,希望大家能够喜欢。