$http 的 Angular IE 缓存问题

IT技术 javascript caching angularjs
2021-01-27 04:45:02

从 IE 发送的所有 ajax 调用都由 Angular 缓存,我得到了304 response所有后续调用。尽管请求是相同的,但在我的情况下,响应不会相同。我想禁用这个缓存。我尝试将cache attribute加到 $http.get 但它仍然没有帮助。如何解决这个问题?

6个回答

我没有为每个 GET 请求禁用缓存,而是在 $httpProvider 中全局禁用它:

myModule.config(['$httpProvider', function($httpProvider) {
    //initialize get if not there
    if (!$httpProvider.defaults.headers.get) {
        $httpProvider.defaults.headers.get = {};    
    }    

    // Answer edited to include suggestions from comments
    // because previous version of code introduced browser-related errors

    //disable IE ajax request caching
    $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
    // extra
    $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
    $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);
我没有使用“If-Modified-Since”标头,没有它也能工作。只需要另外两个。
2021-03-24 04:45:02
这适用于我的本地 GET 请求,但它导致我发出的一个 CORS 请求开始使用 OPTIONS 方法而不是 GET 方法。第 3 方服务器不支持 OPTIONS 方法,因此我的解决方法是使用 jQuery.get() 发出该请求并在响应处理程序中使用 $scope.apply() 。
2021-03-29 04:45:02
在我看来,这个答案应该被标记为答案,虽然 Martin 提供的解决方案确实有效,但它更像是一个黑客而不是实际修复。
2021-04-02 04:45:02
If-Modified-Since = "0"标头的使用破坏了 Tomcat(解析标头日期的问题,因为0不是有效值RFC)。固定使用 valueMon, 26 Jul 1997 05:00:00 GMT代替。
2021-04-07 04:45:02
If-Modified-Since头品牌IIS + iisnode掷通过加载的每一个HTML文件400错误的请求ngIncludengView不过,以下两个标题为我解决了这个问题(我从 Chrome 中提取了它们,它没有缓存问题): $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache'; $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
2021-04-07 04:45:02

您可以向请求附加一个唯一的查询字符串(我相信这是 jQuery 对 cache: false 选项所做的事情)。

$http({
    url: '...',
    params: { 'foobar': new Date().getTime() }
})

一个可能更好的解决方案是,如果您有权访问服务器,那么您可以确保设置了必要的标头以防止缓存。如果您使用ASP.NET MVC 此答案可能会有所帮助。

$http.get(url+ "?"+new Date().toString()) 只是另一种表示,不使用参数而是将其添加到查询字符串中。
2021-03-25 04:45:02

你可以添加一个拦截器。

myModule.config(['$httpProvider', function($httpProvider) {
 $httpProvider.interceptors.push('noCacheInterceptor');
}]).factory('noCacheInterceptor', function () {
            return {
                request: function (config) {
                    console.log(config.method);
                    console.log(config.url);
                    if(config.method=='GET'){
                        var separator = config.url.indexOf('?') === -1 ? '?' : '&';
                        config.url = config.url+separator+'noCache=' + new Date().getTime();
                    }
                    console.log(config.method);
                    console.log(config.url);
                    return config;
               }
           };
    });

您应该在验证后删除 console.log 行。

我在 IE 中遇到了严重的缓存问题,这导致了一个空白页面,因为重要的部分没有执行。使用 propsed 拦截器解决了这个问题!+1
2021-03-13 04:45:02
并且您应该使用$log以防您忘记将它们取出。
2021-03-19 04:45:02
我认为这是最好的方法,因为它避免了 CORS 和 IE 在添加其他标头时触发预检请求的行为的问题。这似乎是不会遇到其他问题的最安全方法
2021-04-06 04:45:02
@dilip pattnaik:- 为什么 angular 和 ie 会出现此问题?
2021-04-06 04:45:02

我只是在 angular 项目的 index.html 中添加了三个元标记,并且在 IE 上解决了缓存问题。

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">
index.html当我们注意到 IE11 正在缓存 AJAX 请求时,我们已经有了这些元标记:/但是$httpProvider如其他答案中所示进行配置工作正常。
2021-04-11 04:45:02

在另一个线程中复制我的答案

对于Angular 2 及更新版本no-cache通过覆盖添加标头的最简单方法RequestOptions

import { Injectable } from '@angular/core';
import { BaseRequestOptions, Headers } from '@angular/http';

@Injectable()
export class CustomRequestOptions extends BaseRequestOptions {
    headers = new Headers({
        'Cache-Control': 'no-cache',
        'Pragma': 'no-cache',
        'Expires': 'Sat, 01 Jan 2000 00:00:00 GMT'
    });
}

并在您的module中引用它:

@NgModule({
    ...
    providers: [
        ...
        { provide: RequestOptions, useClass: CustomRequestOptions }
    ]
})
那些不是服务器响应的标头,而不是浏览器请求的标头吗?(我可以想象一个人可以If-Modified-Since使用上述方法设置过去的某个日期。)
2021-03-23 04:45:02
您的方法将删除任何已经存在的自定义标头。因此,请执行以下操作,而不是创建新的 Header 对象。 headers: req.headers .set('Cache-Control', 'no-cache') .set('Pragma', 'no-cache') .set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT')
2021-03-25 04:45:02
@Vitaliy:- 为什么 angular 和 ie 会出现此问题?
2021-03-29 04:45:02