ThinkPHP 6.0通过token()生成并校验表单令牌防重复提交,支持手动调用validateToken()或注解/中间件自动校验,令牌默认一次性有效、绑定session,需配合前端禁用按钮和重定向优化体验。

ThinkPHP 6.0 使用表单令牌(Token)防重复提交,核心是通过 token() 辅助函数生成唯一标识,并在控制器中调用 $this->validateToken() 或使用中间件自动校验。它不是万能的防刷方案,但对普通表单重复点击、F5刷新重提等场景非常有效。
在模板中生成并嵌入令牌字段
在表单页面(如 add.html 或 edit.html)中,使用内置函数生成隐藏令牌字段:
{:token()}
这会输出类似:
注意:__token__ 是默认字段名,不可修改;该值每次页面加载都会刷新,且与当前 session 绑定。
在控制器中开启令牌验证
有两种常用方式:
-
手动验证:在接收 POST 请求的方法开头调用
$this->validateToken(),验证失败会抛出ValidateException异常,可捕获并提示用户 -
自动验证(推荐):在控制器方法上添加
@token注解(需启用注解支持),或在路由定义中配置中间件think\middleware\TokenCheck
示例(手动验证):
public function save()
{
if ($this->request->isPost()) {
try {
$this->validateToken(); // 验证失败自动抛异常
// 执行保存逻辑
} catch (\think\exception\ValidateException $e) {
$this->error('请勿重复提交');
}
}
}
令牌行为与注意事项
TP6 的令牌机制默认启用“一次性”模式:即令牌验证成功后立即失效,下次提交必须重新加载页面获取新令牌。你也可以调整为“多次有效”:
- 在配置文件
config/token.php中设置'reset' => false,允许同一令牌多次验证(不推荐用于敏感操作) - 若使用 AJAX 提交,需确保每次请求前重新获取令牌(例如通过接口返回新
__token__值),否则后续请求会失败 - 令牌依赖 session,确保 session 正常启动(
session_start()或自动启动已开启)
配合前端做友好交互
仅靠后端验证还不够,建议前端加一层防护提升体验:
- 表单提交后禁用提交按钮(
button.disabled = true),防止用户连点 - 提交成功后重定向(非直接返回结果页),避免 F5 刷新导致重复提交
- 若使用 JS 提交,可在响应成功后调用
location.reload()或跳转,确保下次表单有新令牌
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











