在一个域上,我的 Yii 2.0 Web 应用程序在 Controller 中具有处理 POST 请求的方法。下面是我的 Controller 类中的代码。
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => [
'my-method',
],
'allow' => true,
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'my-method' => ['post'],
],
],
];
}
public function actionMyMethod()
{
Yii::$app->controller->enableCsrfValidation = false;
$response = Yii::$app->response;
$response->format = \yii\web\Response::FORMAT_XML;
return ['msg' => 'OK!'];
}
在另一个域上,我有一个简单的页面(不是 Yii 2.0 应用程序),它使用纯 JavaScript 通过 POST 方法发送 AJAX 请求。下面是代码。
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST", "http://my-domain.com/controller-name/my-method", true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("id=Henry");
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
var responseXml = xmlhttp.responseXML;
txt=" ";
x=responseXml.getElementsByTagName("msg");
for (i=0;i<x.length;i++) {
txt = txt + x[i].childNodes[0].nodeValue;
}
alert(txt);
}
}
每次我尝试运行上面的 JavaScript 代码时,它都会在控制台中显示 POST 400(错误请求)。如果我从 POST 更改为 GET,效果很好。有人可以告诉我我错过了什么吗?上面的代码有什么问题?
最佳答案
如果您想禁用单个操作的 CSRF 验证,您需要在 beforeAction
事件处理程序中执行此操作,因为在操作运行之前会检查 CSRF token (在 beforeAction
中) yii\web\Controller
)。
/**
* @inheritdoc
*/
public function beforeAction($action)
{
if ($action == 'my-method') {
Yii::$app->controller->enableCsrfValidation = false;
}
return parent::beforeAction($action);
}
官方文档:
This answer是相关的,但我在那里没有提到这些细节,也更新了。
关于javascript - Yii框架2.0使用POST方法的AJAX请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30501893/