2

我遇到了一个问题,在大多数情况下(主要是使用 FireFox),在 onModuleLoad 事件中完成的请求没有被缓存。我检查了 FireBug 上的网络控制台,它几乎总是显示那些从服务器而不是从缓存中获取的请求。

我准备了一个测试用例,你可以在http://tradeosam.appspot.com/查看

这是 onModuleLoad 实现:

public void onModuleLoad() {
    RequestBuilder request = new RequestBuilder(RequestBuilder.GET,
            "query/test?v=1-8951245");
    try {
        request.sendRequest(null, new RequestCallback() {

            @Override
            public void onResponseReceived(Request request,
                    Response response) {
            }

            @Override
            public void onError(Request request, Throwable exception) {
            }
        });
    } catch (RequestException e) {
    }

    new Timer() {

        @Override
        public void run() {
            RequestBuilder request = new RequestBuilder(RequestBuilder.GET,
                    "query/test?v=1-23478.34");
            try {
                request.sendRequest(null, new RequestCallback() {

                    @Override
                    public void onResponseReceived(Request request,
                            Response response) {
                    }

                    @Override
                    public void onError(Request request, Throwable exception) {
                    }
                });
            } catch (RequestException e) {
            }
        }
    }.schedule(1000);
}

从代码中可以看出,我在ModuleLoad上做了两个请求,第一个是直接完成的,几乎从不被浏览器缓存。第二个是在 1 秒后使用计时器完成的,并且缓存没有问题。这两个请求具有相同的标头,并转到相同的 Servlet,唯一的区别是用于区分两者的“v”参数。

4

1 回答 1

0

现在我在您的展示中看不到“查询/测试”请求,但我看到的所有 XHR 请求都没有任何针对浏览器的缓存指令。默认情况下,浏览器不缓存 XHR 请求,b/c 作为规则,此类请求必须带来最新的数据。但是如果你想强制浏览器缓存它们,只需将 Cache-Control 添加到客户端的请求标头中。我无法指定具体规则,因为我不知道您对它的要求——至少它应该保留数据多长时间。

请参考 RFC:“ HTTP 中的缓存”和有关 http 缓存的精彩文章:“缓存教程”。

希望这可以帮助。

于 2013-06-08T20:14:37.817 回答