我有一個休息終端,它在GET調用上返回一個列表。我也有一個POST端點來添加新項目和一個DELETE刪除它們。這適用於Firefox和Chrome,並且POST和DELETE在IE11中工作。但是,IE11中的GET僅適用於頁面的初始加載。刷新返回緩存的數據。我在Angular 1中看到過有關這種行爲的帖子,但對Angular 2(發佈候選者1)沒有任何評論。在Angular 2中阻止IE11緩存GET調用
回答
作爲回答here,你可能只覆蓋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 }
]
})
這是一個很好的解決方案,可以讓角度請求無緩存的所有請求,但我不希望所有請求的行爲,因爲一些請求可以緩存很好。我去設置適當的頭服務器端。無論如何,我寧願服務器擁有緩存智能。我可能對這個問題措辭不佳。 – cmaynard
@cmaynard我一邊看着如何爲Andular設置全局緩存,一邊衝擊你的問題,所以從谷歌的角度來看,你的措辭是人們搜索尋找的東西的完美:) –
轉發stackoverflow響應Angular IE Caching issue for $http,您應該爲每個'GET'請求添加頭文件'Pragma','no-cache','If-Modified-Since'。
攔截器的方案不再支持角2。所以你應該擴展http,因爲這裏描述的是What is httpinterceptor equivalent in angular2?。
Angular 4.3現在包含支持攔截器的HttpClient服務。
有點晚了,但我遇到了同樣的問題。對於Angular 4.X我寫了一個自定義的Http類來追加一個隨機數到最後以防止被IE緩存。它基於dimeros的第二個鏈接(What is httpinterceptor equivalent in angular2?)。 警告:不能保證100%無錯。
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Http, Response, XHRBackend, RequestOptions, RequestOptionsArgs,
URLSearchParams } from '@angular/http';
@Injectable()
export class NoCacheHttp extends Http {
constructor(backend: XHRBackend, options: RequestOptions) {
super(backend, options);
}
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
//make options object if none.
if (!options) {
options = { params: new URLSearchParams() };
}
//for each possible params type, append a random number to query to force no browser caching.
//if string
if (typeof options.params === 'string') {
let params = new URLSearchParams(options.params);
params.set("k", new Date().getTime().toString());
options.params = params;
//if URLSearchParams
} else if (options.params instanceof URLSearchParams) {
let params = <URLSearchParams>options.params;
params.set("k", new Date().getTime().toString());
//if plain object.
} else {
let params = options.params;
params["k"] = new Date().getTime().toString();
}
return super.get(url, options);
}
}
我過去曾使用過這種技術來'欺騙'緩存。我認爲這很有用,但通常更好地設置適當的標題。 – cmaynard
今天,我也有這個問題,(該死IE) 。 在我的項目中,我使用httpclient
,那還沒有BaseRequestOptions
。 我們應該使用Http_Interceptor
來解決它!
export class CustomHttpInterceptorService implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler):
Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
const nextReq = req.clone({
headers: req.headers.set('Cache-Control', 'no-cache')
.set('Pragma', 'no-cache')
.set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT')
.set('If-Modified-Since', '0')
});
return next.handle(nextReq);
}
模塊提供
@NgModule({
...
providers: [
...
{ provide: HTTP_INTERCEPTORS, useClass: CustomHttpInterceptorService, multi: true }
]
})
謝謝,這是Angular 5的正確答案。然而,既然我在原始問題中指定了Angular 2,我將留下那個標記爲正確的答案,有一個upvote! – cmaynard
- 1. 在IE11中緩存角Ajax調用
- 2. Angular 2 Http緩存
- 3. 組件正在緩存在Angular2中 - 阻止視圖緩存
- 4. Angular:如何阻止我的$ http調用阻止UI?
- 5. 阻止緩存支持
- 6. 如何阻止FLEX緩存?
- 7. Angular RxJS阻止雙API調用
- 8. 阻止表單緩存
- 9. Angular js - 跨域請求在GET請求中被阻止
- 10. Angular 2無法阻止ngSubmit傳播
- 11. Angular 2 | NgformControl阻止我NgModel從更新
- 12. 阻止MVC 2中的圖像緩存C#
- 13. Angular 2 HTTP GET相當於Angular HTTP GET
- 14. 在Angular應用程序中阻止UI
- 15. 阻止jQuery Mobile中的ajax緩存
- 16. 從緩存中阻止JQUERY .load
- 17. 如何在Angular 2中調用簡單的http GET服務
- 18. Angular 2與Html5應用程序緩存
- 19. Angular 2 GET請求
- 20. Angular 2 - 從方法存儲值GET
- 21. Angular Gridster阻止調整大小
- 22. doctrine 2阻止方法(或類似問題)的LifecycleCallbacks緩存
- 23. 阻止Smarty 2模板被緩存/編譯
- 24. 從緩存的Lib /類阻止導軌2/3
- 25. 在Apache/PHP中阻止GET請求
- 26. 如何防止Angular 2網站上的瀏覽器緩存?
- 27. Angular 2應用程序不支持在IE11中
- 28. 在Angular 2中緩存組件數據應用
- 29. IE11與XHR跨域緩存
- 30. 如何阻止我的gridview緩存?
如果您獲取API不指定任何緩存控制頭 - >這意味着響應是可緩存如果狀態爲200 OK。 – Loc
另請參閱http://stackoverflow.com/questions/36500804/proper-way-to-prevent-angular2-http-request-caching-in-internet-explorer-ie,瞭解客戶端解決方法。 –
@Loc我添加了Cache-Control值no-store和no-cache,並且仍然只在IE中獲得相同的結果。 – cmaynard