Angular:为每个请求添加一个随机数,以禁用IE的缓存

时间:2013-04-18 09:18:14

标签: django caching angularjs

IE非常caching xhr requests。为了克服这个问题,用户建议在网址中添加一个随机数。例如here

虽然这可行,但我正在寻找一种全局添加随机数/全局禁用IE缓存的方法,并且还禁用资源xhr get调用的缓存。我猜我可以通过使用以下方法之一来实现这一目标。但我不确定我到底要做什么......

a)使用$httpProvider.defaults.transformRequest

b)使用request/response promise chaining

中添加的{{1}}

2 个答案:

答案 0 :(得分:0)

这是IE的一个老问题。不确定如何使用Angular的$ httpProvider(或我想要的),但这里有一个函数可以向任何url添加一个随机值,无论它是否已经使用了查询字符串:

function noCacheUrl(url) {
    var urlParser = document.createElement('a');
    urlParser.href = url;
    var q = "nc" + Math.random() + "=1";
    q = urlParser.search ? urlParser.search + "&" + q : "?" + q;
    return urlParser.protocol + "//" + urlParser.host + urlParser.pathname + urlParser.hash + q;
}

请注意,添加的查询参数的 名称 是随机的,而不是值,因此不太可能与任何现有的名称/值对发生冲突。示例:& nc0.8578296909108758 = 1

http://jsfiddle.net/LgjLe/

答案 1 :(得分:0)

我使用Django和自定义中间件向服务器上的响应添加no-cache标头解决了缓存问题。

class NeverCacheXhrMiddleware(object):
    """
    sets no-cache headers for all xhr requests
    xhr requests must send the HTTP_X_REQUESTED_WITH header to 
    be identified correctly as a xhr request using .is_ajax()
    see: http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers
    """
    def process_response(self, request, response):
        if request.is_ajax():
            response['Cache-Control'] = 'no-cache, no-store, must-revalidate'
            response['Pragma'] = 'no-cache'
            response['Expires'] = '0'
        return response