在onModuleLoad中完成的请求根本不会被缓存。主要在FireFox中

时间:2013-02-14 09:58:02

标签: http firefox gwt firebug

我遇到了一个问题,在大多数情况下(主要使用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);
}

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

1 个答案:

答案 0 :(得分:0)

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

请参阅RFC:“Caching in HTTP”以及关于http缓存的精彩文章:“Caching Tutorial”。

希望这有帮助。