V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imherer
V2EX  ›  程序员

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

  •  
  •   imherer · 2017-04-14 16:05:25 +08:00 · 2650 次点击
    这是一个创建于 2573 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天用 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 的请求,和这个无关。

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

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

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

    钱的教训~
    imherer
        9
    imherer  
    OP
       2017-04-14 16:55:57 +08:00
    谢谢各位大佬的回答
    otakustay
        10
    otakustay  
       2017-04-14 17:30:18 +08:00
    预加载吧……重点是你为什么用 GET 请求写数据
    morethansean
        11
    morethansean  
       2017-04-14 18:43:32 +08:00
    Chrome 也会预加载.
    imherer
        12
    imherer  
    OP
       2017-04-14 18:45:48 +08:00
    @otakustay 确实不应该用 get ,我测个东西为了方便所以就 get 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2503 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:59 · PVG 22:59 · LAX 07:59 · JFK 10:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.