【问题标题】:How to force jQuery to issue GET request to server to refresh cached resource如何强制 jQuery 向服务器发出 GET 请求以刷新缓存的资源
【发布时间】:2013-09-20 08:58:20
【问题描述】:

网上有很多关于如何防止 jQuery AJAX 请求被缓存的答案。 这不是我想要做的。

我需要根据我的代码中的条件从缓存中返回 AJAX 请求。也就是在页面加载的时候发出请求,返回缓存的响应是完全可以的(其实是本意)。但是当用户单击一个按钮时,我需要从服务器刷新相同的请求。

我知道我可以通过在 jQuery 中设置 cache: false 选项来做到这一点,但这只会使用不同的 URL 请求数据,因此不会刷新缓存中的响应,并且在下一页使用 cache: true 加载请求将返回过时的数据。

我尝试在请求中添加 Cache-Control 标头,但至少在 IE10 中没有效果。

$.ajax({
    url: Configuration.ApiRootUri + "Notifications",
    type: "GET",
    headers: { 'Cache-Control': refreshCache ? 'no-cache' : 'private' },
    success: function(data) {}
});

是否可以强制浏览器从脚本刷新缓存的资源?

【问题讨论】:

    标签: javascript jquery browser-cache


    【解决方案1】:

    (注:在cmets讨论后重写)

    一种解决方案是将来自服务器的响应存储在本地存储中,并在页面加载时加载它(如果存在)。

    这完全避免了在启动时向服务器发出的请求,并且充当缓存,但在浏览器中。

    这是一个伪算法示例:

    function loadRequest(){
        Call Ajax request
            On success, store the result in the localstorage, call updateHtml(result);
    }
    
    function updateHtml(data) {
        Update the specific html (list, view, etc) with the data
    }
    
    $('#mybutton').on ('click', loadRequest);
    
    $(function() {
        Check if the data in the localstorage exists
            if exists, call updateHtml(localstorage.value);
            else call loadRequest 
    });
    

    就是这样!

    【讨论】:

    • 这并不能解决问题。 1)我需要缓存在浏览器中以删除对服务器的请求。 2) 无法使用服务器缓存 - 并发用户过多加上网络农场。 3)我需要浏览器缓存根据服务器缓存控制响应标头。 4) 您提议随请求发送用户会话密钥 - 这将导致页面加载和刷新的 URL 不同,因此下一页加载将不会使用刷新后的值。
    • 正如我所说,缓存在浏览器中,但这仅在此浏览器(即同一用户,在同一台计算机上使用同一浏览器)已经发出请求时才有效。由于您没有明确指出是要使用缓存还是绝对需要使用缓存,所以我建议两者。该请求将始终向服务器发出,但只有当从服务器返回的标头与发出第一个请求时相同时才会使用缓存。
    • 我正在寻找的是避免请求在页面加载时发送到服务器,但始终在用户单击按钮时发送它。我知道我可以在响应中添加 Must-Revalidate 标头,浏览器现在将始终请求资源,然后服务器将能够以 HTTP 状态代码 304 进行响应,但在我的情况下,服务器将不知道数据是否是最新的(我的解决方案中没有分布式缓存,刷新数据的成本比通过网络发送数据要大得多)。
    • 那么在 localstorage 中存储最后更新的值呢?加载页面时,如果存在本地存储,则将数据加载到本地存储中,如果不存在,则请求服务器(第一次,因此不缓存)。而当用户点击按钮时,你只请求服务器,并将结果存储在 localstorage => 缓存中。
    • @CyrilN。我只是在写非常相似的评论,使用持久存储客户端来获取特定的 URL 请求,例如:"myUrl.com?v="+localStorageValue 这可行吗?我认为需要测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2020-01-22
    • 2016-05-17
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多