官方文档
- 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 的验证:
<?php
namespace 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 验证不通过的问题。