Kev*_*man 11 json google-chrome playframework-2.0
伙计们,我有一个Web应用程序,我已经为相同资源的JSON和HTML表示重用了相同的路由,现在我们称之为/ foo/details.此页面链接,我们称之为/ bar/details.(所以,看/ bar/details你看到链接到 - >/foo/details).
当我从第一页到第二页时,一切正常.当我点击Chrome中的后退按钮时,原始页面呈现为JSON而不是HTML.如果我在浏览器中点击刷新,我会获得HTML表示而不是JSON.
这是我用来检测JSON与HTML的代码:
res.result.map { group =>
render {
case Accepts.Html() => Ok(views.html.groups.details(group))
case Accepts.Json() => Ok(Json.toJson(group))
}
}.getOrElse(NotFound)
Run Code Online (Sandbox Code Playgroud)
这是此模式的标准实现,它可以在任何地方使用,除非在某些情况下我在Chrome中使用后退按钮.
是否有一些我没有清除的值,或者我的页面正在使用Ajax做什么令人困惑Play让它在Json中呈现,或者Chrome可能正在缓存页面但缓存错误的接受标题?
我可以通过使用两种不同的路线来解决这个问题,一种用于Json,另一种用于Html,但我不喜欢,因为我觉得我放弃了.
任何人都只有在后退按钮中导致此行为的原因有任何想法吗?
jay*_*jay 23
凯文,你是对的.但是,还有另一种解决方案.
如果你在响应头中添加"Vary:Accept",它将使chrome和其他具有此问题的浏览器(例如Firefox v 21)区分json和html缓存.注意:Vary:Accept-Encoding标头不起作用,据我测试.
如果你使用nginx,你可以设置:http://wiki.nginx.org/HttpProxyModule#proxy_set_header
proxy_set_header Vary Accept;
但是,nginx存在一个问题,即有时不会发送变化的接受标头,这与缓存有关.请参阅http://wiki.nginx.org/HttpProxyModule#proxy_set_header为了解决这个问题,你可以为nginx打开gzip_vary,但这会发送Vary:Accept-Encoding标头.此标头无法解决问题.
我使用rails,我使用了修改后的before_filter response.headers["Vary"]= "Accept"
我确信还有其他方法可以与其他服务器/框架一起使用.
更多信息:https://web.archive.org/web/20130114082345/http://blog.sdqali.in/blog/2012/11/27/on-rest-content-type-google-chrome-and-caching /
这绝对是 Chrome 的浏览器缓存。它不区分使用“Accept”->“application/json”向 /foo/bar 发出的请求和使用常规 HTML Accept 标头发出的请求。结果,我会加载 HTML 页面,该页面上的 JavaScript 将访问原始 JSON 数据的相同 URL,然后下次我返回时,Chrome 将提供缓存的 JSON,而不是缓存的 HTML。
因此,我必须修改我的路由,以便我的 JSON/REST API 都通过不同的 URL,这样 Chrome(和 Safari)就不会缓存 JSON。
归档时间: |
|
查看次数: |
1965 次 |
最近记录: |