禁用AJAX缓存

11

我现在有点进退两难。我正在构建一个网页,将从CGI后端接收数据。我无法控制CGI后端或服务器(因此无法使用mod_headers或mod_expires)。另外,由于脚本参数的原因,我不能向每个请求附加唯一值(如“&089u0af0d98”)。请求使用XmlHttpRequest对象进行AJAX传输。我尝试设置“If-Modified-Since”和“Cache-Control”请求标头,但并未成功。是否有其他想法可以防止浏览器缓存AJAX响应?

5个回答

13

如果需要,您可以使用POST方法发送随机参数,同时使用GET方法发送重要变量。

如果您在使用IE时遇到问题,发送POST请求可以停止缓存服务器响应。


12

我使用这个 JavaScript 函数(它又使用了 jQuery.ajax 函数),将 cache 参数设置为 false 就可以了。这对我来说完美地解决了问题,也许你可以试一试。

    function ajax_call(urlString)
    {
        ret_val="";
        $.ajax
        (
            {
                type: "GET",
                url: urlString,
                async:false,
                cache:false,
                dataType: 'html',
                success: function(msg)
                {
                    ret_val=msg;
                },
                error:function (xhr, textStatus, thrownError)
                {
                    ret_val=xhr.readyState;
                    alert("status=" +xhr.status);
                }
            }
        );
        return ret_val;
    } 

1
正如我之前告诉David的,jQuery会向我的URL字符串附加一个唯一值,这对我来说是不起作用的。 - Nik

7

我在我的基础html页面(default.aspx)中使用了$.ajaxSetup({ cache: false });,这个网站不是经常被访问的,它很好地工作了。再也没有令人头痛的缓存问题了。


4
我今天遇到了这个问题,发现如果您想继续使用get方法,可以在页面上添加一个隐藏的表单元素,并让JS在将查询提交给ajax之前设置其值为当前时间戳。
我添加了一个类似于以下内容的表单元素:
<input type="hidden" name="ie_sucks" id="ie_sucks", value="1" />

然后,在通过AJAX提交表单的函数中,我使用以下代码将这个隐藏的输入设置为当前时间戳:

$('#ie_sucks').val(new Date().getTime());

上面的代码使用了 JQuery,所以用纯 JS 的话会像这样:
document.getElementById('ie_sucks').value = new Date().getTime();

这不是一个很漂亮的解决方案,但它确实有效。

1

我知道jQuery的.ajax()调用有一个名为“cache”的参数,如果设置为false,将强制浏览器不缓存请求的页面。 也许值得检查jQuery源代码,看看他们是如何做到的。

(我正在检查它,如果我找到任何东西,我会更新的,但提前发布这个答案,以防你或其他人有更好的运气找到它。)


3
我之前曾经涉及过这个问题。它的工作原理是在URL和数据参数末尾添加一个独特的值。不幸的是,那个编写脚本的白痴用的方式让我无法这样做。 - Nik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接