有关如何使用动态会话数据处理静态响应的建议

时间:2011-11-27 04:47:22

标签: ajax caching optimization static comet

想象一个高度缓存的网站,几乎每个GET操作的输出都缓存到一个html文件中,该文件可以直接从HTTP服务器访问,而不必执行服务器端CGI操作。现在想象一下,除此之外,JavaScript还用于使用AJAX过滤HTML请求的响应。 AJAX响应仅包含页面的相应响应(因此对于标准HTML页面,它将包含除周围布局之外的所有内容,对于模式,它将仅包含模式框HTML等...)。

现在让我们假设HTML内容可以中立缓存(当没有人登录时)或缓存给登录的人。页面的某些区域与会话数据相关联(如欢迎消息,配置文件链接等...)该数据特定于会话。但是由于我们正在使用JavaScript,我们可以缓冲AJAX响应,更改会话元素值,然后在用户不知道任何会话热交换的同时将其粘贴到DOM中。这仅仅依赖于GET请求和实际内容不是100%会话相关的页面。

现在这是我的问题。如果我要实现这一点(并且相信我,我会),那么当用户浏览页面时,我如何实际跟踪会话活动?使用传统的服务器端操作,只要用户访问页面,服务器端框架就会更新会话并密切关注与会话相关的变量。使用静态HTTP请求操作,可以避免所有服务器端参与。因此,我需要找出一些方法来跟踪会话的进展情况;这是我的方法:

1)执行两个AJAX请求(或在需要时另外一个): 一旦用户查询页面,则内容将作为静态HTML下载。但在查询该页面的同时,另一个AJAX请求将被服务于特定于会话的URL /服务器更新/查询会话的状态。这可以并排完成,也可以在每次提出几个请求后执行。

优点= HTML文件保持不变,HTML文件可以设置为具有ETag或将来的expires头,JavaScript只能缓存静态HTML并将其用于离线浏览,会话服务器可以专用,优化和配置用于会话活动。 缺点=执行两个AJAX请求,过度轮询潜在的冗余数据,会话处理与内容服务器分离。

2)使用中间代理将会话数据附加为尾随会话JSON 向服务器发出请求。中间存在一个代理,它在本地访问会话数据,然后执行另一个HTTP请求(本地或远程),然后将其与之前获取的会话数据结果连接起来。浏览器以HTML代码的干净副本进行响应,其中包含特定于JavaScript的会话内容,然后在同一时刻更新所有内容。

优点=一次下载所有内容,只需要一个连接,就像普通的HTTP请求一样 Cons =使用动态内容代理时,缓存变得困难,内容长度可能需要搜索并替换为附加其他数据,可能无法与某些浏览器一起使用?

3)将Comet用于会话数据 可以在网站连接开始时建立持久的反向AJAX彗星连接。然后,可以正常访问所有静态HTML请求。可以从彗星连接访问所有与会话相关的请求。

优点=静态内容和动态内容的分离。 Cons = Comet不受支持且效果不佳,服务器延迟可能与同源策略冲突。

你们怎么认为这个问题应该解决?你认为它可行吗?

1 个答案:

答案 0 :(得分:0)

我发现的解决方案是使用模板化数据动态数据相互分离。你自己实现这个太多的工作和太乱了,所以你可以使用MVC框架来提供带模板的JSON请求(AngularJS,KnockoutJS,EmbedJS等等),或者你可以坚持使用模板一般来说。请记住,这会破坏SEO。