Thinkphp使用ajax 提交时遇到的 表单令牌错误 问题
[ 2017-05-10 09:48:32 | 作者: admin ]
thinkphp表单令牌的作用是防止表单重复提交,开启自动验证之后会自动在表单里面生成一个 __hash__ 的隐藏表单,表单通过POST方式提交后与服务器中的session做判断,不一致就提示 表单令牌错误。
解决办法:使用post提交ajax,然后在post数据中加入__hash__,用来完成令牌验证。
服务器端调用create方法会调用 autoCheckToken() 来验证表单令牌。
/lib/core/model.class.php 中有一个函数 autoCheckToken() 执行表单令牌错误的验证,代码如下:
// 自动表单令牌验证
// TODO ajax无刷新多次提交暂不能满足
public function autoCheckToken($data) {
if(C('TOKEN_ON')){
$name = C('TOKEN_NAME');
if(!isset($data[$name]) || !isset($_SESSION[$name])) { // 令牌数据无效
return false;
}
// 令牌验证
list($key,$value) = explode('_',$data[$name]);
if($_SESSION[$name][$key] == $value) { // 防止重复提交
unset($_SESSION[$name][$key]); // 验证完成销毁session
return true;
}
// 开启TOKEN重置
if(C('TOKEN_RESET')) unset($_SESSION[$name][$key]);
return false;
}
return true;
}
解决办法:使用post提交ajax,然后在post数据中加入__hash__,用来完成令牌验证。
服务器端调用create方法会调用 autoCheckToken() 来验证表单令牌。
/lib/core/model.class.php 中有一个函数 autoCheckToken() 执行表单令牌错误的验证,代码如下:
// 自动表单令牌验证
// TODO ajax无刷新多次提交暂不能满足
public function autoCheckToken($data) {
if(C('TOKEN_ON')){
$name = C('TOKEN_NAME');
if(!isset($data[$name]) || !isset($_SESSION[$name])) { // 令牌数据无效
return false;
}
// 令牌验证
list($key,$value) = explode('_',$data[$name]);
if($_SESSION[$name][$key] == $value) { // 防止重复提交
unset($_SESSION[$name][$key]); // 验证完成销毁session
return true;
}
// 开启TOKEN重置
if(C('TOKEN_RESET')) unset($_SESSION[$name][$key]);
return false;
}
return true;
}
[最后修改由 admin, 于 2017-05-10 10:00:28]
评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=2406
这篇日志没有评论。
此日志不可发表评论。