2016-11-25 74 views
2

我正在使用nodejs和express来处理服务器端程序,它按照预期工作,但是当我输入时(甚至不是2个字符的域),服务器发现了google chromes request(并发回应答)。nodejs express在输入时检测到google chrome的地址栏autocompleter

如何阻止我的服务器程序响应谷歌的chromes请求,同时输入地址,即使在开头字母(它完成但没有进入,我总是按回车)但不是当它是一个实际的请求时用户。

即使对于未访问过的网站,谷歌浏览器是否也这样做?

是否有一个特殊的请求参数来过滤这个,所以我只能选择真正的客户端请求,而不是浏览器内部(但入站到我的服务器)请求?当我写地址栏的东西,如“我怎么能”时,它会自动完成一个(已经访问过的)“查询集合”(可能来自该网站的请求),并且刚好在底部有(未访问) “爱”。谷歌浏览器是否会向未访问过的爱情建议网站发起http请求?

谷歌浏览器版本:54.0.2840.99米(64位)

也许这是一些预取技术的浏览器中正常的行为?

+1

嗯,你为什么要阻止这种情况的发生?什么结果是不可取的?需要注意的是,GET请求应该主要是幂等的(除了分析之类的东西)。这意味着,您的服务器上的任何内容都不应该为GET进行变异。 Google不会为btw做POST。 – Parris

+0

如何知道用户是否打开了+关闭的页面,或者他/她甚至没有进入页面,只需滚动到地址栏即可。 (如节省会话时间,但超时时间更短) –

+0

我会问这个问题。例如,您可以在onunload事件中使用JS中的“sendBeacon”来获取相同的信息。 – Parris

回答

5

这称为预渲染在完成输入URL以加快页面加载性能之前,在后台加载网页。

看起来这在服务器端是无法检测到的。

Chromium项目为此打开了一个问题。它标记为“不会修复”(Prerendering does not have any distinguishing HTTP headers)。预取请求不会显示在开发工具“网络”选项卡中,因此您无法通过查看标题来轻松确认。当使用Wireshark检查它们时,不幸的是,将预渲染请求与“正常”请求区分开来没有区别。

您可以如下手动关闭它,但很遗憾,您无法在服务器端与实际请求区分开来。

  1. 在您的计算机上,打开Chrome。
  2. 点击右上角的菜单,然后点击设置。
  3. 点击底部的显示高级设置。
  4. 在“隐私”部分,取消选中“使用预测 服务以更快速地加载页面”旁边的复选框。

,从而可以参照:https://stackoverflow.com/a/35091410/7055233

+0

根据线程,唯一的解决方案是实现页面可见性API https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API – winterfruit

+0

这个预渲染请求对于我的rails应用程序是可见的,并且每当我第一次打开我的申请时,我都感到很烦恼。在同一时间,我收到了两个同样资源的请求。不仅如此,有时我得到了并发性错误“ActionView :: Template :: Error(迭代期间无法将新密钥添加到哈希中)”。 – Ghazi