关于PHP如何用实现防止用户在浏览器上使用后退功能重复提交输入

博主Bruce刚开始搞后台的时候手总是不安分,在后台系统账号登出之后,忽然萌生想法,再点击浏览器的返回键会是什么样的情况呢?
首先这是账号登出的截图
这里写图片描述
账号登出成功之后,然后顺利返回到登录页面(原谅有点丑,Bruce的前端并不好,也没有套用模板,各位看官不要吐槽…)
这里写图片描述
然后呢,手贱的Bruce就尝试点击网页的返回键,猜猜会出现什么情况?
可能有过项目经验的朋友看到文章的开头已经能够猜到结果,对的,也就是返回到了账号登出的笑脸截图
这里写图片描述
手贱贱的Bruce不甘于此,在跳转提示还有一秒的时候,再点击一下网页的返回键,然后出来的结果大吓一跳。
这里写图片描述
是的,连续快速点两下返回键的结果居然是回到了后台系统页面。
事关重大,为了后台数据的安全保障,Bruce决定立马解决这个问题。

首先让我们理清一下思路,为啥能回到去?
1、缓存问题(何为缓存,Bruce给大家举个例子,好譬如你手机上面QQ音乐这个APP,最近播放哪一个按钮的所有你最近听过的音乐就是缓存。你登录其他网站的账号,密码,时间,IP地址甚至是验证码都可以用来缓存)
2、和浏览器有关系吗?为什么不换个浏览器试试(根据Bruce的亲测,无论是Google浏览器,火狐还是360都是能够返回到后台中去,所以可以排除浏览器问题)

所以我们可以思考一下应该怎么解决这个问题?
于是乎,Bruce就觉得应该从缓存这个方面入手。有些同学可能会说,你可以这样给后台每一个页面加入一个判断,判断后台每一个页面有没有缓存账户的信息,没有的话就让他跳转回登录页面。
对的,Bruce也尝试过这个做法。
这里写图片描述
这个想法固然是可以的,但是这样的写法只能在页面刷新的时候,也就是我们连续点击两次返回键,需要页面自己能够刷新或者手动F5,页面才会告诉我们没有缓存(因为前面Bruce在登出账号的时候设置了清除缓存信息),帮我们跳转回登录页面,就好像这样
这里写图片描述
所以这个方法只能用来防止无账号者登录后台h(当然上线网站你连后台登录的机会都没有),或者手动刷新页面才可以用来跳转z回登录首页保障后台数据。
所以Bruce就在想能不能强制一下浏览器不再缓存web页面呢?于是乎百度了一下的确可以有(百度其实是真的挺好用的),经过大量数据的查找和测试,Bruce找到了一种最为简单安全的方法:
header为解决方法,这种方法非常有效它强制浏览器重新访问服务器下载页面,而不是从缓存读取页面。使用这种方法时,编程者的主要任务是创建一个会话级的变量, 通过这个变量确定用户是否仍旧可以查看那个不适合通过后退按钮访问的页面。由于浏览器不再缓存这个页面,当用户点击后退按钮时浏览器将重新下载该页面,此时程序就可以检查那个会话变量,看看是否应该允许用户打开这个页面。
第二种方法就是我们可以干脆让登录页面浏览器的后退键完全失效。原理:用新页面的URL替换当前的历史纪录,这样浏览历史记录中就只有一个页面,后退按钮永远失效。
注:history.go和history.back(包括用户按浏览器历史前进后退按钮)触发,页面由于使用pushState修改了history),会触发popstate事件。
这里写图片描述
总结:其实这只是一个小小的页面bug,根据Bruce这一晚上的资料查找其实还有多种解决办法,因为时间问题就不一一举例了,解决的方法有多种,禁止浏览器使用缓存,但并不是所有的浏览器都守规矩。
一般的做法是页面加载后用ajax获取当前登陆状态,京东就是这样的。
欢迎大家补充或者向我指出各种问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值