[javascript] $ http에 대한 각도 IE 캐싱 문제

IE에서 보낸 모든 아약스 호출은 Angular에 의해 캐시되며 304 response모든 후속 호출에 대해 a 를 얻습니다 . 요청은 동일하지만 제 경우에는 응답이 동일하지 않습니다. 이 캐시를 비활성화하고 싶습니다. cache attribute$ http.get에 추가를 시도 했지만 여전히 도움이되지 않았습니다. 이 문제를 어떻게 해결할 수 있습니까?



답변

각 단일 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';
}]);


답변

요청에 고유 한 쿼리 문자열을 추가 할 수 있습니다 (jQuery가 cache : false 옵션으로 수행하는 작업이라고 생각합니다).

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

더 나은 솔루션은 서버에 액세스 할 수있는 경우 캐싱을 방지하기 위해 필요한 헤더가 설정되어 있는지 확인할 수 있습니다. ASP.NET MVC 이 답변을 사용 하면 도움 될 수 있습니다.


답변

인터셉터를 추가 할 수 있습니다.

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 줄을 제거해야합니다.


답변

난 그냥 각도 프로젝트에서 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">


답변

다른 스레드에서 내 답변을 복제 합니다 .

들어 각도 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'
    });
}

그리고 당신의 모듈에서 그것을 참조하십시오 :

@NgModule({
    ...
    providers: [
        ...
        { provide: RequestOptions, useClass: CustomRequestOptions }
    ]
})


답변

내가 일한 보장 된 것은 다음과 같은 내용이었습니다.

myModule.config(['$httpProvider', function($httpProvider) {
    if (!$httpProvider.defaults.headers.common) {
        $httpProvider.defaults.headers.common = {};
    }
    $httpProvider.defaults.headers.common["Cache-Control"] = "no-cache";
    $httpProvider.defaults.headers.common.Pragma = "no-cache";
    $httpProvider.defaults.headers.common["If-Modified-Since"] = "Mon, 26 Jul 1997 05:00:00 GMT";
}]);

나는 모든 방법의 올바른 사용을 보장하기 위해 위의 해결 방법의 2 병합했다,하지만 당신은 대체 할 수 common와 함께 get또는 다른 방법 즉 put, post, delete다른 경우에이 작업을 할 수 있습니다.


답변

이 줄만 도움이되었습니다 (Angular 1.4.8).

$httpProvider.defaults.headers.common['Pragma'] = 'no-cache';

UPD : 문제는 IE11이 적극적인 캐싱을 수행한다는 것입니다. Fiddler를 살펴볼 때 F12 모드에서 요청이 “Pragma = no-cache”를 전송하고 페이지를 방문 할 때마다 끝 점이 요청되는 것을 알았습니다. 그러나 일반 모드에서는 페이지를 처음 방문했을 때 끝 점이 한 번만 요청되었습니다.