官方文档

页面使用

  1. <input type="hidden" name="__token__" value="{:token()}" />
  2. // 也可使用以下写法
  3. {:token_field()}

默认的令牌 token 名称是 __token__,如果需要自定义名称及令牌生成规则可以使用:

  1. {:token_field('__hash__', 'md5')}

如果是 AJAX 提交的表单,可将 token 设置在 meta 中:

  1. <meta name="csrf-token" content="{:token()}">
  2. // 也可使用以下写法
  3. {:token_meta()}

然后在全局 Ajax 中使用这种方式设置 X-CSRF-Token 请求头并提交:

  1. $.ajaxSetup({
  2. headers: {
  3. 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content');
  4. }
  5. });

当然,也可直接提交 __token__ 值到服务器:

  1. <form>
  2. <input type="hidden" name="__token__" value="{{:token()}}">
  3. <input type="text" name="name" value="">
  4. <input type="text" name="content" value="">
  5. </form>
  6. <script type="text/javascript">
  7. $.ajax({
  8. url: '',
  9. type: 'post',
  10. data: {
  11. __token__: $('input[name="__token__"]').val(),
  12. name: $('input[name="name"]').val(),
  13. content: $('input[name="content"]').val(),
  14. },
  15. success: function(data) {
  16. console.log(data);
  17. }
  18. })
  19. </script>

验证器验证

在验证器中添加 token 的验证:

  1. <?php
  2. namespace app\admin\validate;
  3. use think\Validate;
  4. class Article extends Validate
  5. {
  6. protected $rule = [
  7. 'name' => 'require',
  8. 'content' => 'require',
  9. '__token__' => 'token'
  10. ];
  11. protected $message = [
  12. 'name.require' => 'name不能为空',
  13. 'content.require' => 'name不能为空',
  14. '__token__.token' => '重复提交,请刷新页面',
  15. ];
  16. protected $scene = [
  17. 'update' => ['name', 'content', '__token__'],
  18. ];
  19. }

注意上述示例中 __token__ 的位置,我习惯把 __token__ 放在最后位置。这样可以避免 Ajax 二次提交 token 验证不通过的问题。