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 
}