今天用 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 的请求,和这个无关。
1
RE 2017-04-14 16:10:34 +08:00 1
是的, Safari 是有这个 “模糊匹配” 并默认选上的 feature ,一旦回车直接进入模糊匹配的那个 URL ;
用 iOS 原生输入法,在模糊匹配之后可以删掉后面部分, 但如果用的是第三方输入法(例如搜狗)是删不掉的,只会是选中状态,要输入其它的字符或空格来替换地址栏的内容 |
2
undeflife 2017-04-14 16:15:18 +08:00 1
最简单的办法其实是 不要用 get 请求处理写入
|
3
a342191555 2017-04-14 16:22:48 +08:00 1
safari 偏好设置——搜索——在后台载入“最常点选”
GET 请求应该是幂等的 |
4
knightdf 2017-04-14 16:31:14 +08:00 1
chrome 一样有这个问题,这是是浏览器 prediction 优化特性,会提前加载他认为最匹配的 url ,所以在你敲下去之前其实浏览器就已经把这个页面加载好了,这样你一敲这个网页就出来了
|
5
koor 2017-04-14 16:31:36 +08:00 1
输入时匹配到的第一条会预加载,按下回车之后便直接呈现已经下载完成的页面
|
6
MForever78 2017-04-14 16:33:24 +08:00 2
这个真的是 feature...
|
7
qiyuey 2017-04-14 16:41:00 +08:00 1
改用 POST 请求
|
8
Liang 2017-04-14 16:48:04 +08:00 1
这个坑我必须说一下!!!
有个给用户发奖金的操作,因为很少用,所以我一般是写一个接口然后丢上生产环境访问触发一下;然而有一天,我发现给用户发了 2 笔,但我只访问了接口一次,后来测试之后才发现, safari 读出历史记录之后,会在我回车之前,请求一次。。。 钱的教训~ |
9
imherer OP 谢谢各位大佬的回答
|
10
otakustay 2017-04-14 17:30:18 +08:00
预加载吧……重点是你为什么用 GET 请求写数据
|
11
morethansean 2017-04-14 18:43:32 +08:00
Chrome 也会预加载.
|