代码之家  ›  专栏  ›  技术社区  ›  itsadok

使用浏览器后退按钮时忽略内容协商

  •  6
  • itsadok  · 技术社区  · 16 年前

    情况如下:

    我有一个Web应用程序,它响应对资源列表的请求,比如:

    /items
    

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

    在返回的HTML中有一些javascript(jquery),它随后执行Ajax请求以检索实际数据:

    项目
    

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

    问题来了 :用户导航到另一页,稍后按后退按钮。然后提示他们保存文件。结果是 杰森 项目列表的数据。

    到目前为止,我已经在谷歌Chrome和火狐3.5中确认了这一点。

    这里有两种可能的答案:

    1. 我怎样才能解决这个问题。是 有一些神奇的组合 缓存控制头或其他 Voodoo导致浏览器 这是对的?

    2. 如果你认为我在做什么 这里真是大错特错,我该怎么走 关于这个?我在寻求正确, 但也不想牺牲 灵活性。

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

    3 回复  |  直到 13 年前
        1
  •  6
  •   bobince    16 年前

    是否有缓存控制头的神奇组合,或其他巫毒导致浏览器在这里做正确的事情?

    如果您为不同的accept:headers提供不同的响应,则必须包括header:

    Vary: Accept
    

    在你的回应中。这个 Vary 头还应该包含影响响应的任何其他请求头,例如,如果您执行gzip/deflate压缩,则必须包括accept编码。

    也就是说,不幸的是,处理了 Vary 糟糕的是,完全破坏缓存,这对你来说可能重要,也可能不重要。

    如果你认为我在这里做了严重的错误,我该怎么做呢?

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

        2
  •  1
  •   Community Mohan Dere    9 年前

    我知道这个问题由来已久,但为了防止其他人碰到这个问题:

    我在使用jquery的Rails应用程序中遇到了同样的问题,我通过告诉浏览器不要将json响应与这里给出的解决方案缓存到另一个问题中来解决:

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

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

        3
  •  0
  •   Tom Christie    13 年前

    旧问题,但是对于其他任何人来说,询问者使用accept头没有任何问题。

    这是已确认的Chrome错误。(以前也在火狐中,但现在已经修复了。)

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