声明一下: 只是刚好在开发过程中遇到了需要这种方法去做,并不一定好,但是至少解决了我得需求!如果不好,请勿喷!谢谢!

在ajax无刷新过程中,使用表单令牌,第一个遇到得问题就是提交表单遇到错误或提交成功仍然不想刷新该页面!而表单令牌因为页面得不刷新并不会刷新!
有人会觉得用ajax请求去获取表单令牌,这样得话用不用表单令牌我感觉区别不大,毕竟你提交之后同步更新了令牌,并抛出来,没有经过验证,起不到csrf防护作用!

在这里我突然想起来!新打开一个表单页面,表单令牌不就更新了吗?
于是就想起了iframe,建立一个隐藏iframe,然后通过刷新iframe来取得最新表单令牌!应用到当前表单上进行提交,不就和刷新了当前页面效果一样了么!
我得思路就是这样,也不知道对不对,至少应该比ajax输出表单令牌要安全一些!
上代码 开撸

后端:

// 验证token值,跟着官方教程走
        $check = $request->checkToken('__token__', $request->param());
        if(false === $check) {
            return  json('token不正确');
        }
// 创建csrf控制器方法访问 一定得创建在表单权限页面内 方法名自己定
    /**
     * 获取表单令牌
     * @param Request $request
     * @return string
     * @throws \Exception
     */
    public function csrf(Request $request)
    {
        return View::fetch('csrf');
    }
// 模板文件就一段 View::fetch('csrf');里得输出
    <meta name="csrf-token" content="{:token()}">

前端:

<iframe width="0" height="0" src="{:url('admin/Index/csrf')}" id="loadCSRF"></iframe>
//建立一个公用fun来刷新iframe
    function loadCsrf() {
        var _iframe1=window.document.getElementById('loadCSRF');
        _iframe1.contentWindow.location.reload(true);
    }
//ajax提交表单header 
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('#loadCSRF').contents().find('meta[name="csrf-token"]').attr('content')
    }
});







AD:阿里云2000元代金券九折优惠点我领取 ¥2000元大礼包

AD:腾讯云2860元无门槛代金券,限时领取点我领取 ¥2860无门槛代金券