在我的脚本中,我有一个通过ajax提交的表单,像这样。
jQuery.ajax({
url:jQuery('form',modal).attr('action'),
contentType: "application/json; charset=utf-8",
dataType: 'json',
type:'post',
data: {
email:jQuery('input[name="email"]',modal).val(),
something:jQuery('input[name="something"]',modal).val(),
level:jQuery('select[name="level"]',modal).val(),
YII_CSRF_TOKEN: jQuery('input[name="csrf"]').val()
},
success: function(data){
jQuery('.message',modal).html(data.message).slideDown();
if (!data.success){
jQuery('input[name="email"]',modal).addClass('error');
} else {
jQuery('input[name="email"]',modal).removeClass('error');
}
}
});
一切都很正常 然后今天我写了一个新的功能,用于从数据库中删除项目。所以我写了我的php函数(没什么特别复杂的),并添加了jQuery的ajax调用,通过点击链接来触发。
// ajax request
jQuery.ajax({
url:jQuery(this).attr('href'),
contentType: "application/json; charset=utf-8",
dataType: "json",
type:'post',
data: {
something:jQuery(this).attr('alt'),
YII_CSRF_TOKEN:jQuery('input[name="csrf"]').val()
},
success: function(data){
}
});
链接和表单都在同一个视图中。但是在添加了新的删除功能后,一切都崩溃了。我无法向服务器发出任何POST请求,只是出现 "Error: The CSRF token could not be verified". 我看不出问题所在,因为我正在传递CSRF。firebug日志显示。
YII_CSRF_TOKEN bf6d9bf62ee96f32e34a74244baca7f2f1bdd569
something 4
我也许能理解新的函数因为任何原因而不能工作 但为什么另一个函数也坏了,我不明白。
我已经知道问题出在哪里了,想和大家分享一下。当然这是很琐碎的问题。
在PHP函数(action)的流程中,每次遇到问题没有预期的结果(record doesn't exist等),它就会返回类似的东西。
if (empty($user)){
echo json_encode(array('success'=>0,'message'=>'User does not exist'));
return false;
}
我想你们中的一些人已经看到了我的错误。问题是,一旦你
return false;
Yii会自动返回 "Invalid Request".因此,不管你是否在服务器端做得很好,你都必须返回true。所以
if (empty($user)){
echo json_encode(array('success'=>0,'message'=>'User does not exist'));
return true;
}
按预期工作。
对于信息 "错误。The CSRF token could not be verified." (CSRF令牌无法验证) 我还是不明白问题出在哪里,但也找到了解决办法。我意识到,这个消息是在我第一次使用$_POST变量进行任何操作时返回的。因此,我在动作开始时做的是。
$post = $_POST;
可能不是完美的解决方案,但它是有效的。