3

ここにいくつかのコード例があります。同じ URL に対して 4 つの xmlhttprequests() を続けて作成します。この場合、URL は呼び出しごとに新しい UUID を返すため、4 つの要求が送信され、4 つの異なる応答が返されることが予想されます。Chrome 18、Firefox、および Safari では、これが発生します。

ただし、Chrome 19 では、1 つのリクエストのみが送信されますが、ブラウザは 4 つのリクエストすべてが同じ値で返されたかのように動作します。つまり、コールバックは 4 回実行されますが、毎回同じ応答テキストが返されます。開発者ツールと Wireshark はどちらも、実際に行われたリクエストは 1 つだけであることを確認しています。

ブラウザーのキャッシュ動作に関係しているのではないかと考えましたが、クライアント側 (pragma: no-cache) とサーバー側 (Cache-Control: no-cache) の両方で遊んでも役に立ちませんでした。リクエストごとに異なる偽のクエリ パラメーターを追加すると、4 つの実際のリクエストすべてが強制的に作成されますが、何が変更され、それを処理する別の方法 (URL パラメーター以外) に興味があります。また、これについて話している他の人を見つけることができないので、私は何か変なことや間違ったことをしているのではないかと疑っています.

<!doctype HTML>
<script>
  function doOne(i) {
    var xh =  new XMLHttpRequest();
    xh.open("GET", "/uuid", true);
    xh.setRequestHeader("pragma", "no-cache");
    xh.onreadystatechange = function() {
      if (xh.readyState == 4) {
        var p = document.createElement('p');
        p.innerHTML = xh.responseText;
        document.body.appendChild(p);
      }
    }
    xh.send(null);
  }
  window.onload = function() {
    for (var i = 0; i < 4; i++) {
      doOne(i);
    }
  }
</script>

参考までに、このテスト ケース (web.py) のサンプル サーバーに使用しているものを次に示します。

#!/usr/bin/env python

import uuid
import web

urls = (
  '/uuid', 'Uuid',
)

class Uuid():
  def GET(self):
    web.header('Cache-Control', 'no-cache');
    return str(uuid.uuid1())

app = web.application(urls, globals())

if __name__ == '__main__':
  app.run()
4

2 に答える 2

0

Rails アプリケーション内で Chrome 19 を使用しても同じ問題が発生しました。それを修正するために、このコードは私にとってはうまくいきます:

before_filter :set_cache_buster
def set_cache_buster
  if request.xhr?
    response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
    response.headers["Pragma"] = "no-cache"
    response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
  end
end

すべての XMLHttpRequest のキャッシュを無効にします。

クレジット: http://blog.serendeputy.com/posts/how-to-prevent-browsers-from-caching-a-page-in-rails/

于 2012-05-25T06:11:03.127 に答える
0

最近これにも出くわしましたが、Chrome に応答を再利用させないようにする良い方法が見つかりませんでした。Firefox にはこのような動作はないようです。

私はクロムの問題を提出しました。これが意図した動作なのかバグなのか、誰かが明確にしてくれることを願っています。

于 2014-01-13T10:53:55.970 に答える