6

情况如下:

我有一个响应资源列表请求的 Web 应用程序,可以说:

/items

这最初是由 Web 浏览器通过导航到该路径直接请求的。浏览器使用它的标准“Accept”标头,其中包括“text/html”,我的应用程序注意到这一点并返回项目列表的 HTML 内容。

返回的 HTML 中包含一些 JavaScript (jQuery),然后执行 ajax 请求来检索实际数据:

/items

只有这一次,“Accept”标头被显式设置为“application/json”。同样,我的应用程序注意到了这一点,并且 JSON 被正确地返回到请求中,数据被插入到页面中,一切都很顺利。

问题来了:用户导航到另一个页面,然后按下 BACK 按钮。然后提示他们保存文件。这原来是项目列表的JSON数据。

到目前为止,我已经确认 Google Chrome 和 Firefox 3.5 都会发生这种情况。

这里有两种可能的答案:

  1. 我该如何解决这个问题。是否有一些 Cache-Control 标头或其他巫术的神奇组合导致浏览器在这里做正确的事情?

  2. 如果您认为我在这里做错了什么,我该怎么办?我正在寻求正确性,但也尽量不牺牲灵活性。

如果有帮助,该应用程序是一个 JAX-RS Web 应用程序,使用 Restlet 2.0m4。如果有帮助,我可以提供示例请求/响应标头,但我相信这个问题是完全可重现的。

4

3 回答 3

6

是否有一些 Cache-Control 标头或其他巫术的神奇组合导致浏览器在这里做正确的事情?

如果您对不同的 Accept: 标头提供不同的响应,则必须包含标头:

Vary: Accept

在您的回复中。Vary标头还应包含影响响应的任何其他请求标头,因此例如,如果您执行 gzip/deflate 压缩,则必须包含 Accept-Encoding。

不幸的是,IE 处理了许多Vary糟糕的值,完全破坏了缓存,这对你来说可能很重要,也可能无关紧要。

如果您认为我在这里做错了什么,我该怎么办?

我不认为在同一个 URL 上为不同类型提供不同内容的想法是非常错误的,但是你让自己陷入了比你真正需要的更多的兼容性问题。依靠通过 JSON 工作的标头在实践中并不是一个好主意。您最好使用不同的 URL,例如/items/json/items?format=json

于 2009-09-23T14:35:08.247 回答
1

我知道这个问题很老,但以防万一其他人遇到这个问题:

我在使用 jQuery 的 Rails 应用程序中遇到了同样的问题,我通过告诉浏览器不要缓存 JSON 响应来修复它,这里给出的解决方案是针对另一个问题:

jQuery $.getJSON 对每个控件只工作一次。不再到达服务器

这个问题似乎只发生在 Chrome 和 Firefox 上。Safari 可以很好地处理后退行为,而无需明确告诉它不要缓存。

于 2011-05-17T08:53:12.617 回答
0

老问题,但对于其他看到这一点的人来说,提问者对 Accept 标头的使用没有任何问题。

这是 Chrome 中已确认的错误。(以前也在 Firefox 中,但已修复。)

http://code.google.com/p/chromium/issues/detail?id=94369

于 2012-10-24T09:30:00.423 回答