浏览器失控的后退按钮?——Chrome的导航安全策略

简介: 你是否遇到过浏览器后退按钮失灵的情况?其实这又是浏览器的安全策略导致的,不妨来瞅一瞅到底是怎么回事?

记录一个Chrome的特性引发的问题。


背景


前些日子有一个同事找我,说是页面上出现了非常奇怪的跳转现象。


简单来说就是,他做了一个前置页面A,用于获取用户登录信息,根据用户角色的不同,自动跳转至不同路由的页面。但是当他点击浏览器后退时,返回的不是页面A,而是空白的新标签页。相当于页面A的历史记录被浏览器吃掉了,所以直接后退到了新标签页。


我之前遇到过浏览器导航后退出现了非预期的情况,但只是出现在UC浏览器,并且是在 pathname 路由的模式下。但同事给我发的视频中,使用的是Chrome,且用的 hash 路由。之前的经验让我第一时间联想到,是不是Chrome出现新bug了?


测试


我写了一个简单的可复现用例



/

// PageA.tsximportReact, { useEffect } from'react';
import { history } from'umi';
constPageA= () => {
useEffect(() => {
setTimeout(() => {
history.push('/sub-page/1');
// window.history.pushState(null, '', '/sub-page/1');// location.href = '/sub-page/1';    }, 1000);
  }, []);
return (
<div>      This is Page A.
</div>  );
};
exportdefaultPageA;


然后我得到了这样一个稳定的现象,页面A在1秒后跳转至页面B,但点击后退按钮时,并不能回退到页面A,且不论是使用react 御用的 history或原生history或是直接修改location,都能稳定复现这个情况。



然后我也发现了能够避免吃掉历史记录的方式,就是用户与页面产生交互,比如这样点击一下页面,前进后退就正常了:



emmm?“用户交互后才生效”这个操作怎么和之前 Chrome 提出的,禁止在用户与页面交互前自动播放有声视频的安全策略如出一辙?我隐约感觉到这可能不是bug


排查


由于我先入为主的观点,我还是以为这是Chrome的缺陷,也就是我认为,在用户与页面交互之前,浏览器遗漏了历史记录,所以我在chromiumissue看板上搜了好一会儿,但是并没有得到我想要的结果。


我不死心,拉了历史版本的Chromium挨个测试,最后发现在74版本的Chromium上,出现了这个特性。这个版本距离现在已经两年了吧,这么明显的问题不可能没有人提出吧?


于是我开始往浏览器新特性的方向去查找,查了74版本相关的New in Chrome,但似乎没有找到太多内容。


就在这时,同事给我发来了一个链接,这里说明了在用户与页面交互之前,Chrome的前进后退按钮会忽略该网站所跳转过的历史记录栈。


这个操作是为了防止网站恶意拦截用户的浏览器导航而做的。例如该网站通过在页面A进入页面后立即push跳转到新页面的代码,导致你后退时便触发该跳转,而永远无法后退到更早的页面。


后来我也找到了相关的文章,看来之前的方向不太对。


结语


由于存在这个特性,作为前端工程师的我们,在页面跳转时就要尽量避免这种,进入页面后直接跳转页面,且还需要用户进行后退操作的业务逻辑。


另外时间关系,我只搜索到了上面两个博主发的介绍文章,如果有官方对于该特性的文档,欢迎告知。

相关文章
|
12天前
|
Web App开发 数据采集 存储
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
本文探讨了如何利用Chrome DevTools Protocol (CDP) 与 Selenium WebDriver 提升浏览器自动化效率,结合代理IP技术高效采集微博数据。通过CDP,开发者可直接操作浏览器底层功能,如网络拦截、性能分析等,增强控制精度。示例代码展示了如何设置代理IP、cookie及user-agent来模拟真实用户行为,提高数据抓取成功率与稳定性。适用于需要频繁抓取互联网数据的应用场景。
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
|
5天前
|
Web App开发 存储 前端开发
Chrome浏览器的跨域问题
Chrome浏览器的跨域问题
|
1月前
|
Web App开发
Chrome——谷歌浏览器chrome如何模拟其他客户端
Chrome——谷歌浏览器chrome如何模拟其他客户端
73 1
Chrome——谷歌浏览器chrome如何模拟其他客户端
|
28天前
|
Web App开发 JSON 安全
【跨域难题终结者】:一键解锁Chrome浏览器神秘设置,彻底告别开发阶段的跨域烦恼!
【8月更文挑战第20天】跨域是前端开发常遇难题,尤其在前后端分离项目中。浏览器因安全考量会阻止不同源间的请求。本文对比CORS、JSONP、代理服务器等解法,并介绍开发阶段通过调整Chrome设置来临时禁用跨域限制的方法,提供启动Chrome及使用`fetch`API示例,适合快速测试。但请注意这不适用于生产环境,存在一定安全风险。
93 1
|
29天前
|
Web App开发
成功解决Chrome浏览器 控制台下看不到接口信息的问题
这篇文章提供了解决Chrome浏览器控制台不显示接口信息问题的方法,包括检查过滤设置和确保“保留日志”开关已打开。
成功解决Chrome浏览器 控制台下看不到接口信息的问题
|
1月前
|
Web App开发 前端开发 JavaScript
手摸手教你,从0到1开发一个Chrome浏览器插件
开发 Chrome 插件既有趣又具成就感。本教程将引导你从零开始,逐步创建一个简单的 Chrome 插件。首先了解 Chrome 插件是可增强浏览器功能的小程序。以一个基础示例开始,你将学习如何设置开发环境,包括安装 Chrome 和准备文本编辑器,并掌握 HTML、CSS 和 JavaScript 的基础知识。接着,我们将构建插件的基本结构,涉及 `manifest.json` 配置文件、`background.js` 后台脚本、`popup.html` 用户界面以及 `style.css` 样式表。
137 8
|
1月前
|
Web App开发
Chrome浏览器导出HTTPS证书
Chrome浏览器导出HTTPS证书
39 0
Chrome浏览器导出HTTPS证书
|
17天前
|
Android开发 iOS开发 C#
Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
27 0
|
17天前
|
Web App开发 缓存 前端开发
哇塞!Chrome 浏览器竟有四大神秘进程,带你探秘互联网世界的强大引擎!
【8月更文挑战第31天】Chrome浏览器因其快速稳定的表现深受用户喜爱,其背后是四大独特多进程架构的支持:浏览器主进程管理界面与进程协调;网络进程处理网络请求及缓存;渲染进程将网页内容转化为可视化页面;插件进程则确保各类插件如Flash Player的安全稳定运行。通过这些进程间的高效协作,Chrome实现了流畅、稳定的上网体验。例如,在访问新闻网站时,各进程协同工作,确保网页内容顺利加载和显示。理解这些进程有助于提升使用体验并有效解决问题。
29 0
|
2月前
|
Web App开发 前端开发 JavaScript
Chrome插件实现问题之用户在浏览器中输入URL后,浏览器进程会进行什么操作
Chrome插件实现问题之用户在浏览器中输入URL后,浏览器进程会进行什么操作

热门文章

最新文章