发现 Safari 一个 bug(不知道是 feature 还是 bug)

2017-04-14 16:05:25 +08:00
 imherer

今天用 webstorm debug node 代码,主要流程就是 Safari 访问一个带参数的连接,然后向数据库里插入一条记录 假如链接为: http://localhost:3000?name=1001 , Safari 里输入连接然后敲下回车,就将 1001 写入数据库。 发现的问题就是当我在输入 name 值的时候,如果 Safari 的历史记录里存在对应的或者是模糊匹配到的话, Safari 会触发请求这个匹配到的连接的操作。 也就是说假如我的 Safari 有如下历史记录

http://localhost:3000?name=1002
http://localhost:3000?name=1003
http://localhost:3000?name=1004

我打开 Safari 当我输入到 http://localhost:3000?name=1 它如果优先匹配到 1001 的话,就直接会将 1001 写入数据。 我换了 Chrome 则没有这样的情况,换了 vscode+Safari 或者 终端+Safari 也是同样的问题。 不知道我描述清楚没,大家有这样的情况吗? 另外排除了 favicon.ico 的请求,和这个无关。

2674 次点击
所在节点    程序员
12 条回复
RE
2017-04-14 16:10:34 +08:00
是的, Safari 是有这个 “模糊匹配” 并默认选上的 feature ,一旦回车直接进入模糊匹配的那个 URL ;
用 iOS 原生输入法,在模糊匹配之后可以删掉后面部分,
但如果用的是第三方输入法(例如搜狗)是删不掉的,只会是选中状态,要输入其它的字符或空格来替换地址栏的内容
undeflife
2017-04-14 16:15:18 +08:00
最简单的办法其实是 不要用 get 请求处理写入
a342191555
2017-04-14 16:22:48 +08:00
safari 偏好设置——搜索——在后台载入“最常点选”

GET 请求应该是幂等的
knightdf
2017-04-14 16:31:14 +08:00
chrome 一样有这个问题,这是是浏览器 prediction 优化特性,会提前加载他认为最匹配的 url ,所以在你敲下去之前其实浏览器就已经把这个页面加载好了,这样你一敲这个网页就出来了
koor
2017-04-14 16:31:36 +08:00
输入时匹配到的第一条会预加载,按下回车之后便直接呈现已经下载完成的页面
MForever78
2017-04-14 16:33:24 +08:00
这个真的是 feature...
qiyuey
2017-04-14 16:41:00 +08:00
改用 POST 请求
Liang
2017-04-14 16:48:04 +08:00
这个坑我必须说一下!!!

有个给用户发奖金的操作,因为很少用,所以我一般是写一个接口然后丢上生产环境访问触发一下;然而有一天,我发现给用户发了 2 笔,但我只访问了接口一次,后来测试之后才发现, safari 读出历史记录之后,会在我回车之前,请求一次。。。

钱的教训~
imherer
2017-04-14 16:55:57 +08:00
谢谢各位大佬的回答
otakustay
2017-04-14 17:30:18 +08:00
预加载吧……重点是你为什么用 GET 请求写数据
morethansean
2017-04-14 18:43:32 +08:00
Chrome 也会预加载.
imherer
2017-04-14 18:45:48 +08:00
@otakustay 确实不应该用 get ,我测个东西为了方便所以就 get 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/354886

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX