文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习

前言

ThinkPHP出于安全的考虑增加了表单令牌Token,由于通过Ajax异步更新数据仅仅部分页面刷新数据,就导致了令牌Token不能得到更新,紧接着的第二次新建或更新数据(提交表单时)失败——不能通过令牌的验证。

当然了,最简单的办法就是刷新整个页面,就导致了异步刷新的无意义!在网上搜寻了很多,有好几种方法;看完觉得有一个最好:

Ajax异步动态请求创建新令牌并更新到本地

主要思路:在每次发送表单结束后(不管成功与否)通过Ajax异步请求一个新的表单令牌并保存到表单隐藏域中,下次提交表单就使用新的表单令牌去通过。

最终的效果如下:

V2.5.0.png

主要分成三步:

第一步:在Index控制器下创建生成Token的方法

之所以选择在Index控制器下创建,主要考虑在整个admin(后台)可以方便的引用该方法,不需要每次都根据控制器找寻相应的方法。也就是说,该方法其他控制器都可以引用!

namespace appadmincontroller;

use thinkController;

class Index extends Valid {

// 生成token函数

public function getToken() {

$request = hinkfacadeRequest::instance();

echo $request->token();

}

}

第二步:在Javascript中创建Ajax获取新令牌

由于后台生成新令牌的地址已经固定了,也就是:

/admin/Index/,因此通过jQuery的Get方法容易获取该令牌!

// 获取新Token并更新

function getNewToken() {

$.get("/admin/Index/getToken", function(data) {

document.getElementById("__token__").value = data;

});

}

第三步:在Html页面中创建隐藏域保存令牌

其实在ThinkPHP的表单示例代码中已经有了该代码。页面第一次加载时的令牌Token是随着页面分配的,后面的令牌就是通过Ajax获取的!

最后,我们就可以在javascript的相应提交表单的地方增加语句申请新令牌了!举例,下面的示例代码在提交后不管成功与否都申请了新的令牌。

/**

* Ajax动态更新数据并异步刷新页面

* @Author DuDongHua

* @DateTime 2018-04-28T21:21:23+0800

* @param {对象} Button 表单按钮对象

* @param {文本} Modal 模块

* @param {文本} Controller 控制器

* @param {文本} Action 方法

* @param {文本} Location Ajax加载页面的位置id

* 使用方法:表单对象不用提交的任何设置,提交假按钮设置onclick即可

* 注意:

* 1. 在javascript中拼接Thinkphp5的URL地址,不需要"{:url(‘" + Modal + "/" + Controller + "/" + Page + "‘)}方法

* 只需要直接拼接地址即可,如:var MeURL = ‘/‘+Modal+‘/‘+Controller+‘/‘+Page;

*/

function EditData(Button,Modal,Controller,Action,Location,Page){

// 设置默认参数

var Modal = arguments[1] ? arguments[1] : "admin"; // 模块名

var Controller = arguments[2] ? arguments[2] : "index"; // 控制器

var Action = arguments[3] ? arguments[3] : "editData"; // 方法名

var Location = arguments[4] ? arguments[4] : "content"; // Ajax加载页面的位置id

var Page = arguments[5] ? arguments[5] : "index"; // Ajax加载页面控制器中的方法

// 生成本页面的url用于更新后异步刷新

var MeURL = ‘/‘+Modal+‘/‘+Controller+‘/‘+Page;

setLoaderIn(true); //打开加载图标

// 异步请求数据

$.ajax({

url: ‘/‘+Modal+‘/‘+Controller+‘/‘+Action,

type: ‘POST‘,

data: $(Button).closest("form").serialize(), //表单序列化

dataType: ‘json‘,

success: function(data){

// 更新页面并提示

// window.location.reload(); //当加载整个页面时有效但ajax更新时加载到主页

loadAjaxHTML(MeURL,Location);

showMsg(data.msg);

setLoaderIn(false); //关闭加载图标

getNewToken(); // 获取新Token

},

error:function(XMLHttpRequest, textStatus, errorThrown){

showMsg(XMLHttpRequest.status+" "+XMLHttpRequest.readyState,textStatus,"red","#f60");

getNewToken(); // 获取新Token

}

});

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对敏而好学论坛/嗨学网的支持。

php token 失效时间,ThinkPHP5.1表单令牌Token失效问题的解决_php实例 - PHP相关推荐

  1. ThinkPHP6项目基操(18.实战部分 表单令牌Token 防CSRF)

    表单令牌Token 0. 前言 1. TP6 令牌token使用 1.1 表单提交 1.2 AJAX提交 2. TP6 令牌token验证 2.1 路由验证 2.2 控制器验证 2.3 验证器验证 0 ...

  2. thinkPHP5.0表单令牌使用

    表单令牌的作用:避免表单的重复提交(如在tp5提交成功等待跳转页面刷新页面会在次提交表单) 原理:在初始化表单时,生成一个session标识'token',提交表单时将这个token一起提交过去,然后 ...

  3. 小博老师解析Java核心技术点 ——表单令牌(一)

    2019独角兽企业重金招聘Python工程师标准>>> [理论知识] 我们在网站开发的过程中,经常需要会使用到form表单,表单提供了丰富的客户端与服务器端交互的控件.但是在开发过程 ...

  4. thinkphp 表单令牌

    表单令牌 ThinkPHP支持表单令牌验证功能,可以有效防止表单的重复提交等安全防护.要启用表单令牌功能,需要配置行为绑定, 在应用或者模块的配置目录下面的行为定义文件tags.php中 就是在你的 ...

  5. ThinkPHP5表单令牌+表单数据验证验证规则

    转:http://blog.163.com/zhuxun_why/blog/static/26813905020171861417642/ 表单验证真的很简单 相比较yii的表单验证tp做的很人性 也 ...

  6. go实践二十 web开发--表单唯一token 表单验证 防止xss攻击 上传文件 cookie处理

    新建一个 testform2.gtpl 文件,内容如下: <!doctype html> <html lang="en"> <head>< ...

  7. 表单令牌阻止数据重复提交

    在session中存放一个特殊标志 在服务器端,生成一个唯一的标识符,将它存入session,同时将它写入表单的隐藏字段中,然后将表单页面发给浏览器,用户录入信息后点击提交,在服务器端,获取表单中隐藏 ...

  8. python提交表单无效_使用Django Form解决表单数据无法动态刷新的两种方法

    一.无法动态更新数据的实例 1. 如下,数据库中创建了班级表和教师表,两张表的对应关系为"多对多" from django.db import models class Class ...

  9. 异步提交表单插件jquery.form.min.js的使用实例

    因为项目中需要达到效果:前台点击按钮弹出文件选择框,选择文件确定之后,上传到后台对文件进行处理并给出响应信息. 尝试过使用$.post,$.ajsx,将表单序列化之后传到后台,但是后台并不能收到文件, ...

最新文章

  1. inline-block元素4px空白间隙的解决办法
  2. SGU - 507 启发式合并维护平衡树信息
  3. [JZOJ P1291] [DP]添加括号
  4. 男高音,女高音,男中音,女中音,男低音,女低音
  5. everything便携版和安装版区别_什么是超极本?超极本和笔记本的区别科普知识...
  6. 关于idea的git账号与电脑的git账号不一致的问题。已解决!
  7. 吴恩达机器学习作业Python实现(五):偏差和方差
  8. python脚本 sonar报告
  9. 2.7 矩阵分块及矩阵乘法的四种方式
  10. 【高级UI】【027】RecyclerView侧滑源码解析
  11. UVA 3713 Astronauts
  12. 关于Palantir——第三部分:数据集成
  13. python深度学习tensorflow和fme结合,实现档案扫描件数据自动分类
  14. 小白不知道raw批量转换jpg怎么转?分享好用的方法
  15. Eclipse汉化版本和导入src
  16. xupt嵌入式学习(day1)
  17. Mac版excel如何快速进行数据拆分?
  18. newman工具的运用
  19. 数据挖掘期末复习--上篇
  20. 记录开发HIS系统体温单的思路历程

热门文章

  1. 【暑假禁止摆烂】可以看看Java55个项目去练手
  2. slurm 常用环境变量
  3. SQLServer基础语法大全(基础篇)
  4. SMSLib实现Java短信收发的功能
  5. Jmeter常用插件,安装集成压力测试工具,dubbo接口插件下载
  6. 数字绘图工具Corel Painter v12.0原版下载附有效注册破解方法
  7. 修改设置android studio 为自定义背景色,绿豆沙色。
  8. 关于GPS与GIS的一些思考
  9. TestNG实现远程执行火狐浏览器
  10. anki是用什么语言html,我所用的anki插件