ThinkPHP5.1表单令牌令牌失效问题的解决方案
前言
出于安全考虑,ThinkPHP添加了一个表单Token。由于只有部分页面通过Ajax异步刷新数据,Token令牌无法更新,第二次创建或更新数据(提交表单时)失败,——无法通过令牌验证。
当然,最简单的方法就是刷新整个页面,这就导致了无意义的异步刷新!网上搜了很多,有好几种方法;看完之后,觉得有一个最好的:
Ajax异步动态请求创建新的令牌并在本地更新的主要思想是在每次发送表单后(不管是否成功)通过Ajax异步请求新的表单令牌并保存在表单的隐藏字段中,然后在下次提交表单时使用新的表单令牌传递。
最终效果如下:
V2.5.0.png
主要分为三个步骤:
步骤1:在索引控制器下创建一个生成令牌的方法
之所以选择在Index控制器下创建,是因为它在整个admin(后台)中很容易被引用,不需要每次都根据控制器找到对应的方法。也就是说这种方法的其他控制器可以参考一下!
?phpnamespace app \ admin \ controller;使用思考\控制器;Class Index扩展Valid {//生成标记函数公共函数gettoken(){ $ request=\ think \ facade \ request :3360 instance();echo $ request-token();}}第二步:用Javascript创建Ajax来获取新的令牌
因为后台生成的新令牌的地址已经固定了,也就是/admin/Index/,通过jQuery的Get方法很容易获取令牌!
//获取一个新的Token并更新函数getnewtoken () {$。get ('/admin/index/gettoken ',函数(数据){document。getelementbyid(“_ _ token _ _”)。值=数据;});}第三步:在Html页面中创建隐藏字段来保存令牌
实际上,这个代码已经存在于ThinkPHP的表单示例代码中。第一次加载页面时,Token Token随页面一起分发,通过Ajax获得以下令牌!
!-隐藏区域-输入类型=' hidden ' id=' _ _ token _ _ ' name=' _ _ token _ _ ' value=' { $ request。token } '/最后,我们可以添加一条语句,在表单以javascript提交的对应位置申请一个新的token!例如,以下示例代码适用于提交后的新令牌,无论它是否成功。
/** * Ajax动态更新数据并异步刷新页面* @作者杜东华* @ DateTime 2018-04-28t 21:21336023 0800 * @ param {对象}按钮表单按钮对象* @param {文本}模态模块* @param {文本}控制器控制器* @param {文本}行动方法* @param {文本}位置埃阿斯加载页面的位置id *使用方法:表单对象不用提交的任何设置,提交假按钮a设置单击事件即可* 注意: * 1.在爪哇岛描述语言中拼接Thinkphp5的统一资源定位器地址,不需要{:url('模态'/'控制器'/'页面')}方法* 只需要直接拼接地址即可,如:var MeURL='/'模态'/'控制器'/'页面;*/函数编辑数据(按钮、模式、控制器、动作、位置、页面){ //设置默认参数var Modal=参数[1]?参数[1]:“admin”;//模块名定义变量控制器=参数[2]?参数[2]:“指数”;//控制器var操作=参数[3]?参数[3]:“编辑数据”;//方法名变量位置=参数[4]?参数[4] :"内容";//Ajax加载页面的位置id var Page=参数[5]?参数[5]:“指数”;//Ajax加载页面控制器中的方法//生成本页面的全球资源定位器(统一资源定位符)用于更新后异步刷新var MeURL='/'模态'/'控制器'/'页面;setLoaderIn(真);//打开加载图标//异步请求数据$.Ajax({ URL : '/' Modal '/' Controller '/' Action,type: 'POST ',data: $(Button).最接近('形式')。serialize(),//表单序列化数据类型: 'json ',成功:函数(数据){ //更新页面并提示//窗口。位置。重载();//当加载整个页面时有效但创建交互式、快速动态网页应用的网页开发技术更新时加载到主页loadAjaxHTML(MeURL,Location);showMsg(数据。味精);setLoaderIn(false);//关闭加载图标getNewToken();//获取新令牌},错误:函数(XMLHttpRequest,textStatus,错误通过){ showMsg(XMLHttpRequest。状态“”XMLHttpRequest。readystate,textStatus,“red”,“# f60”);getNewToken();//获取新token } });}总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。
版权声明:ThinkPHP5.1表单令牌令牌失效问题的解决方案是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。