2014-12-01 50 views
3

我有一個網頁很少的頁面。
其中一些頁面需要userId和userName以用於JavaScript上下文中的任何處理。使userId可用於JavaScript而不會破壞緩存的模式

注意:用戶標識沒有被用於安全性,也沒有被髮送回服務器,所以欺騙不是問題。

問題:什麼是將userId和userName傳遞給JavaScript上下文的好方法。

UPDATE 我非常希望能夠用於從服務器到JavaScript代碼傳遞任何數據(例如默認值列表,排序和過濾設置)的通用模式,這樣我就沒有解決用戶id問題與傳遞initialSort和initialFilter值的問題不同。

以下是我能想到的一些方法。我明白,所有這些都會起作用,但我希望有一個更好的模式。我也有興趣在學習解決方案的其他缺點我正在考慮在這裏:

1通行證帳戶及從服務器用戶名作爲非服務器cookie。
缺點:cookie會被髮送回服務器與每個請求,這是一種浪費(雖然並不重要)。

2.使用自定義標頭
缺點:標頭不適用於JavaScript的初始請求。

3.使AJAX請求獲取數據
缺點:需要額外的HTTP旅程。

4.渲染在線數據的初始頁面HTML
缺點:蕭條緩存,使頁面不可緩存。

5.切換極性(工作在星際旅行每次),我最喜歡到目前爲止
而是得到了大多數HTML的初始之旅 - 重寫頁面,以便初始頁面返回大多數據,而標記則分別加載(和緩存)。例如:

<html><body> 
    <div data-bind="template: 'pages/invoices'" /> <!-- using KO external template to load markup --> 
    <script src="require.js"></script> 
    <script> 
     require([...], function (...) { 
      var vm = new PageViewModel('userId-bob', 'Bob Smart'); // <-- content rendered by server 
      ko.applyBindings(vm); 
     }); 
</script></body></html> 

缺點:頁面是search-crawlers敵對(在我的情況下不是問題)。

+0

凡大部分數據來自何處的時刻?它是被包含在初始頁面中,還是以後通過AJAX加載?根據你的情況,*該數據不可能被緩存,所以我建議將它包含在內(這也可能是userId在沒有數據的情況下是無用的,反之亦然,所以這個解決方案使得這個解決方案更合適)。 – Matt 2014-12-01 18:40:21

+0

本地存儲是否有可能? – danronmoon 2014-12-01 18:43:03

+0

我想爲userId做一個額外的請求,而不是修改這個特定問題的最小代碼更改。如果這種情況一直持續下去,那就值得用不同的方式來處理 - 在HTML中渲染數據,或者在服務器渲染的模板代碼中添加一些用戶證書中間件。對於一次或首次使用它的情況,我認爲AJAX請求已足夠好。也許修改PageViewModel的構造函數來獲取用戶信息,如果它沒有給出?如果情況再次發生,請先修復並制定模式。 – 2014-12-01 18:57:42

回答

0

根據你的情況,我可能會把它放在一個cookie中,而不用擔心開銷。

+1

您可以通過使用無cookie的域來爲您的資產提供服務來降低開銷。 – Matt 2014-12-01 18:41:52

1

我會做的是讓它使用sessionStorage。

加載頁面時,請檢查sessionStorage對象以獲取所需的數據。

如果sessionStorage中不存在數據,那麼您知道這是第一次加載頁面(對於此會話至少)。然後,您可以執行ajax調用來獲取這些數據並將其存儲。

如果數據確實存在於sessionStorage中,那麼您不需要執行任何額外的ajax調用。

這應該讓你減少到每個會話只有一個額外的HTTP旅程,這對我來說似乎相當合理。

喜歡的東西

if(sessionStorage.userId && sessionStorage.userName) { 
    //the data exist, assign them to a global var or pass to the function that needs them 
} else { 
    //the data do not exist, make an ajax request to get the data and store them 
}