官方文档
- Version 5.1:https://www.kancloud.cn/manual/thinkphp5_1/354109
- Version 6.0:https://www.kancloud.cn/manual/thinkphp6_0/1037632
页面使用
<input type="hidden" name="__token__" value="{:token()}" />// 也可使用以下写法{:token_field()}
默认的令牌 token 名称是 __token__,如果需要自定义名称及令牌生成规则可以使用:
{:token_field('__hash__', 'md5')}
如果是 AJAX 提交的表单,可将 token 设置在 meta 中:
<meta name="csrf-token" content="{:token()}">// 也可使用以下写法{:token_meta()}
然后在全局 Ajax 中使用这种方式设置 X-CSRF-Token 请求头并提交:
$.ajaxSetup({headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content');}});
当然,也可直接提交 __token__ 值到服务器:
<form><input type="hidden" name="__token__" value="{{:token()}}"><input type="text" name="name" value=""><input type="text" name="content" value=""></form><script type="text/javascript">$.ajax({url: '',type: 'post',data: {__token__: $('input[name="__token__"]').val(),name: $('input[name="name"]').val(),content: $('input[name="content"]').val(),},success: function(data) {console.log(data);}})</script>
验证器验证
在验证器中添加 token 的验证:
<?phpnamespace app\admin\validate;use think\Validate;class Article extends Validate{protected $rule = ['name' => 'require','content' => 'require','__token__' => 'token'];protected $message = ['name.require' => 'name不能为空','content.require' => 'name不能为空','__token__.token' => '重复提交,请刷新页面',];protected $scene = ['update' => ['name', 'content', '__token__'],];}
注意上述示例中 __token__ 的位置,我习惯把 __token__ 放在最后位置。这样可以避免 Ajax 二次提交 token 验证不通过的问题。
