2009-09-23 63 views
6

这里时的情况:内容协商忽略使用浏览器的后退按钮

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

/items 

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

在返回的HTML是一些JavaScript(jQuery的),然后做一个Ajax请求检索实际数据:

/items 

只是这一次,“接受”头明确设置为“应用程序/ JSON”。同样,我的应用程序注意到这一点,并且JSON被正确地返回到请求中,数据被插入到页面中,并且一切都很开心。

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

到目前为止,我已确认这发生在Google Chrome和Firefox 3.5中。

有两种可能这里的答案:

  1. 我怎样才能解决这个问题。是 有一些神奇的组合 缓存控制头,或其他 伏都教导致浏览器在这里做 正确的事情?

  2. 如果你觉得我在做点什么 这里可怕的错,我该怎么去 这个呢?我正在寻求正确性,但也努力不牺牲 的灵活性。

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

+0

“返回”按钮是邪恶的。 – 2009-09-23 13:25:43

+0

这看起来像我将找到后的未来问题(http://stackoverflow.com/questions/5250923)。我很好奇,你最终坚持使用这个解决方案还是最终放弃了它的不同URL?对于同一资源的不同表示的单一RESTful URL的清洁度当然是理想的。 – mckamey 2011-03-09 19:25:53

回答

6

缓存控制头文件或其他巫术导致浏览器在这里做正确的事情有一些神奇的组合吗?在你的回应

Vary: Accept 

如果你提供不同的不同的反应接受:头,你必须包括头。 Vary标题还应该包含任何其他影响响应的请求标头,所以例如,如果要执行gzip/deflate压缩,则必须包含Accept-Encoding。

IE很遗憾地处理很多Vary的值,完全打破缓存,这对你来说可能并不重要。

如果您认为我在这里做了一些可怕的错误,我应该怎么做呢?

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

+0

在同一个URL上提供不同的资源是错误的;为HTTP提供相同资源的不同表示方式。你想用XML,JSON,格式良好的可读HTML或明文来看它吗?它总是一样的东西,但与您选择的格式。不幸的是,一些浏览器打破了这一点,你必须在响应中使用黑客。如果你的服务同时提供“application/json”和“text/html”,Internet Explorer将会因为它的烦琐的Accept头部而获取JSON版本。 – 2009-10-29 15:25:09

1

我知道这个问题是旧的,但以防万一别人运行到这一点:

我使用jQuery具有Rails应用程序这个同样的问题,我告诉浏览器固定它不缓存这里给出一个不同的问题解决JSON响应:

jQuery $.getJSON works only once for each control. Doesn't reach the server again

问题似乎只与Chrome和Firefox发生。 Safari正在处理返回行为,没有明确告诉它不缓存。

+0

这个答案适用于我,如果你设置你的jQuery.ajax()请求中的“缓存”选项为“false”,你可以反击,它将按预期工作 – 2011-09-08 05:33:21