我的解决方案如下:
html 每个表单有一个token {:token()}
重写token验证,销毁后生成新的token
class BaseValidate extends \think\Validate {
/**
* 验证表单令牌
* @access protected
* @param mixed $value 字段值
* @param mixed $rule 验证规则
* @param array $data 数据
* @return bool
*/
protected function token($value, $rule, $data)
{
$rule = !empty($rule) ? $rule : '__token__';
if (!isset($data[$rule]) || !Session::has($rule)) {
// 令牌数据无效
return false;
}
// 令牌验证
if (isset($data[$rule]) && Session::get($rule) === $data[$rule]) {
// 防止重复提交
Session::delete($rule); // 验证完成销毁session
\think\Request::instance()->token($rule, 'md5');
return true;
}
// 开启TOKEN重置
Session::delete($rule);
\think\Request::instance()->token($rule, 'md5');
return false;
}
}
利用Hook在ajax返回时增加新的token
\think\Hook::add('app_end',function($params){
$data = $params->getData();
if(request()->isAjax() && !empty($data) && !empty($data['code']) && $data['code'] == 200){
$token = \think\Session::get('__token__');
if($token){
$data['refresh_token'] = $token;
}
$params->data($data);
}
});
然后利用ajax的全局方法 提交时自动加上token值 判断如果有返回的refresh_token就更新页面所有的__token__值