2016-11-25 63 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

相關問題