Javascript xhr缓存来自getResponseHeader的值?
我遇到了一个非常令人沮丧的错误。我不确定到底发生了什么,但我认为xhr正在对响应头进行某种缓存 我的应用程序正在为后端身份验证服务使用Desive_token_auth。我们将它与循环访问令牌一起使用,因此我编写了一个在每个请求之后运行的函数Javascript xhr缓存来自getResponseHeader的值?,javascript,ajax,xmlhttprequest,rxjs,Javascript,Ajax,Xmlhttprequest,Rxjs,我遇到了一个非常令人沮丧的错误。我不确定到底发生了什么,但我认为xhr正在对响应头进行某种缓存 我的应用程序正在为后端身份验证服务使用Desive_token_auth。我们将它与循环访问令牌一起使用,因此我编写了一个在每个请求之后运行的函数 function storeAndGetResponseHeaders(xhr) { const headersObj = {}; headerKeys.filter((key) => xhr.getResponseHeader(k
function storeAndGetResponseHeaders(xhr) {
const headersObj = {};
headerKeys.filter((key) => xhr.getResponseHeader(key))
.forEach((key) => {
headersObj[key] = xhr.getResponseHeader(key);
window.sessionStorage.setItem(key, xhr.getResponseHeader(key));
});
return headersObj;
}
其中,headerKeys
是['access-token','client','expiry','uid','token type']
。因此,任何包含这些头的响应都应该将它们保存到会话存储中,然后将它们返回到一个对象中,该对象存储在我编写并添加到每个请求的AJAX服务中。我们使用的是rxjs
,而这项服务只是一个薄薄的包装。这就是RxAjax.ajax
的样子
ajax(urlOrRequest) {
const request = typeof urlOrRequest === 'string' ? { url: urlOrRequest } : urlOrRequest;
request.headers = Object.assign({}, this.headers, urlOrRequest.headers);
request.url = `${this.baseUrl}${request.url}`;
return Observable.ajax(request).map(this.afterRequest, this);
}
其中this.headers
是上次请求中存储的头(或会话存储中加载的头)this.afterRequest
是从响应xhr设置头的内容
我的问题是,我的headers对象(特别是旧的访问令牌)中有错误的值。我注意到,当我在赋值后添加headersObj
的日志语句时,有时它会有来自过去请求的旧响应头。但是,当我在dev console Network选项卡中查看请求本身时,它不会在响应头中显示任何auth头(“access-token”、“client”等)。如果我在浏览器上做了一次硬刷新,这个问题会被修复一段时间,但是回来的时候看起来令人费解
注意,我们正在使用
rxjs
发出请求,这可能是相关的(但我不认为这是问题的原因,因为我正在尝试从原始xmlhttprequest
对象中读取标题)。谢谢 正如巴尔马在评论中所说,这是一个缓存问题。chrome控制台中可能有一个bug,它没有显示缓存请求中的缓存头。因此,即使看起来没有auth头,实际上也有
如果使用jQuery,则可以向请求中添加选项cache:false
,以防止缓存。因为我不是,所以我做的第一件事就是尝试向每个请求添加?cache=${new Date().toJSON}
,这成功地破坏了缓存并修复了我的问题(这就是jQuery中的cache:false
)
我们的后端是rails,所以我最后添加了
before_action :set_cache_headers
...
private
def set_cache_headers
response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
end
到我的应用程序控制器。现在浏览器不会缓存任何请求。不确定这是否是我们的长期解决方案您确定它正在发送请求,而不仅仅是使用缓存响应吗?尝试在URL中添加缓存清除器。你说得对!谢谢最后我设置了response.headers[“Cache Control”]=“no Cache,no store,必须对每个请求重新验证”(在rails中)。请随意回答问题,这样我就可以接受了!我不认识rails。你可以回答你自己的问题。老兄,这是一个棘手的问题,浪费了一整天的时间试图解决它,谢谢你提出这个问题并回答它!