代码之家  ›  专栏  ›  技术社区  ›  Salamander2007

阻止浏览器缓存jquery ajax调用结果

  •  238
  • Salamander2007  · 技术社区  · 17 年前

    如果我使用 $.get() ,结果将缓存在浏览器中。

    在querystring中添加一些随机字符串似乎可以解决这个问题(我使用 new Date().toString() 但这感觉像是一个黑客。

    有没有其他方法可以做到这一点? 或者,如果唯一的字符串是实现这一点的唯一方法,那么除了 new Date() ?

    20 回复  |  直到 9 年前
        1
  •  221
  •   Community Mohan Dere    8 年前

    我用 new Date().getTime() ,这将避免冲突,除非在同一毫秒内发生多个请求:

    $.get('/getdata?_=' + new Date().getTime(), function(data) {
        console.log(data); 
    });
    

    编辑: 这个答案有好几年的历史了。它仍然有效(因此我没有删除它),但是 现在有更好/更干净的方法来实现这一点 . 我喜欢 this 方法,但 this 如果要禁用缓存 每一个 在页面的生存期内请求。

        2
  •  497
  •   Peter J    13 年前

    以下内容将阻止缓存所有将来的Ajax请求,无论您使用哪种jquery方法($.get、$.ajax等)。

    $.ajaxSetup({ cache: false });
    
        3
  •  293
  •   Jonathan Moffatt    17 年前

    jquery的$.get()将缓存结果。而不是

    $.get("myurl", myCallback)
    

    您应该使用$.Ajax,它将允许您关闭缓存:

    $.ajax({url: "myurl", success: myCallback, cache: false});
    
        4
  •  22
  •   miceuz    17 年前

    另一种方法是在生成Ajax调用响应的代码中不提供服务器端的缓存头:

    response.setHeader( "Pragma", "no-cache" );
    response.setHeader( "Cache-Control", "no-cache" );
    response.setDateHeader( "Expires", 0 );
    
        5
  •  15
  •   Community Mohan Dere    8 年前

    这里的所有答案都会在请求的URL上留下一个示意图,该示意图将显示在服务器的访问日志中。

    我需要一个没有副作用的基于标题的解决方案,我发现可以通过设置中提到的标题来实现。 How to control web page caching, across all browsers? .

    至少对铬起作用的结果是

    $.ajax({
       url: url, 
       headers: {
         'Cache-Control': 'no-cache, no-store, must-revalidate', 
         'Pragma': 'no-cache', 
         'Expires': '0'
       }
    });
        6
  •  13
  •   Greg    17 年前

    就我个人而言,我觉得查询字符串方法比在服务器上设置头更可靠——不能保证代理或浏览器不会缓存它(有些浏览器比其他浏览器更差——不命名)。

    我通常使用 Math.random() 但是我认为使用日期没有任何错误(您不应该以足够快的速度执行Ajax请求,以获得相同的值两次)。

        7
  •  9
  •   Mark Bell    9 年前

    遵循文件: http://api.jquery.com/jquery.ajax/

    你可以使用 cache 属性:

    $.ajax({
        method: "GET",
        url: "/Home/AddProduct?",
        data: { param1: value1, param2: value2},
        cache: false,
        success: function (result) {
            // TODO
        }
    });
    
        8
  •  5
  •   Thomas Hansen    17 年前

    使用POST请求而不是GET…? (无论如何,你应该…)

        9
  •  5
  •       17 年前

    真正的问题是为什么不需要缓存这个。如果不应该缓存它,因为它会一直更改,那么服务器应该指定不缓存资源。如果它只是有时更改(因为它所依赖的某个资源可以更改),并且客户机代码有一种了解它的方法,那么它可以将一个虚拟参数附加到从这些资源的某个哈希或最后修改日期计算出来的URL(这就是我们在Microsoft Ajax脚本资源中所做的,这样可以永远缓存这些资源,但新的版本仍然可以按照它们出现的样子提供服务)。如果客户机不知道更改,正确的方法应该是让服务器正确地处理head请求,并告诉客户机是否使用缓存的版本。 在我看来,附加一个随机参数或从客户机告诉从不缓存是错误的,因为可缓存性是服务器资源的一个属性,所以应该由服务器端决定。 另一个要问自己的问题是,这个资源是真的应该通过GET服务还是应该通过POST服务?这是一个语义问题,但它也具有安全含义(只有当服务器允许GET时,才会有攻击起作用)。无法缓存Post。

        10
  •  4
  •   finpingvin    17 年前

    也许您应该改为查看$.ajax()(如果您使用的是jquery,它看起来是这样的)。 看一看: http://docs.jquery.com/Ajax/jQuery.ajax#options 以及“缓存”选项。

    另一种方法是查看如何在服务器端缓存东西。

        11
  •  4
  •   itsadok    17 年前

    当然,“缓存中断”技术将完成任务,但如果服务器向客户机指示不应缓存响应,则不会首先发生这种情况。在某些情况下,缓存响应是有益的,有时则不然。让服务器决定数据的正确生存期。你以后可能想换。从服务器执行比从用户界面代码的许多不同位置执行要容易得多。

    当然,如果您对服务器没有控制权,这也没有帮助。

        12
  •  3
  •   krosenvold    17 年前

    除了给出的优秀答案之外,还有一点:如果您使用非Ajax备份解决方案为没有Javascript的用户运行,那么无论如何,您都必须纠正那些服务器端头文件。这并非不可能,尽管我理解那些放弃的人;)

    我肯定还有一个问题,这样你就可以得到一整套合适的标题。我不完全相信,米修斯的回答涵盖了所有的基础100%。

        13
  •  3
  •   Athasach Brad Larson    13 年前

    对于那些使用 cache 选择权 $.ajaxSetup() 在MobileSafari上,似乎您可能需要使用一个时间戳来发布文章,因为MobileSafari也会缓存这个时间戳。根据文件 $.ajax() (你从那里得到指示) AjAxSupUp() ):

    将cache设置为false只能正确处理head和get请求。它通过将“时间戳”附加到get参数来工作。对于其他类型的请求,不需要该参数,除非在IE8中,当对已经由get请求的URL进行发布时。

    所以在我上面提到的情况下,单独设置这个选项对您没有帮助。

        14
  •  2
  •   Santosh Upadhayay    12 年前

    基本上只是增加 cache:false; 在Ajax中,您认为内容会随着进展而改变。在那里内容不会改变的地方,你可以忽略这一点。这样你每次都会得到新的回应

        15
  •  2
  •   LCJ    11 年前

    Internet Explorer’s Ajax Caching: What Are YOU Going To Do About It? 建议三种方法:

    1. 向查询字符串中添加缓存总线令牌,比如?日期=[时间戳]。在jquery和yui中,您可以告诉他们自动执行此操作。
    2. 使用post而不是get
    3. 发送一个HTTP响应头,特别禁止浏览器缓存它
        16
  •  2
  •   Mark Bell    10 年前

    现在,通过在Ajax请求中启用/禁用缓存选项很容易做到这一点,就像这样

    $(function () {
        var url = 'your url goes here';
        $('#ajaxButton').click(function (e) {
            $.ajax({
                url: url,
                data: {
                    test: 'value'
                },
                    cache: true, //cache enabled, false to reverse
                    complete: doSomething
                });
            });
        });
        //ToDo after ajax call finishes
        function doSomething(data) {
            console.log(data);
        }
    });
    
        17
  •  1
  •   Net Solver    13 年前

    如果您使用的是IE 9,那么您需要在控制器类定义前面使用以下内容:

    [输出缓存(nostore=true,duration=0,varybyparam=“*”)]

    公共类测试控制器:控制器

    这将阻止浏览器缓存。

    有关此链接的详细信息: http://dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/

    事实上,这解决了我的问题。

        18
  •  1
  •   rstackhouse zzandy    12 年前

    正如@athasach所说,根据jquery文档, $.ajaxSetup({cache:false}) 除GET和HEAD请求外,不工作。

    你最好寄回 Cache-Control: no-cache 服务器的头。它提供了更清晰的关注分离。

    当然,对于您不属于您的项目的服务URL,这将不起作用。在这种情况下,您可以考虑从服务器代码代理第三方服务,而不是从客户机代码调用它。

        19
  •  1
  •   Marius    10 年前

    如果正在使用.NET ASP MVC,请通过在端点函数上添加以下属性来禁用对控制器操作的缓存: [OutputCacheAttribute(varyByParam=“*”,Duration=0,NoStore=true)]

        20
  •  -3
  •   xiaoyifang    12 年前

    将math.random()附加到请求URL