Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript xhr缓存来自getResponseHeader的值?_Javascript_Ajax_Xmlhttprequest_Rxjs - Fatal编程技术网

Javascript xhr缓存来自getResponseHeader的值?

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

我遇到了一个非常令人沮丧的错误。我不确定到底发生了什么,但我认为xhr正在对响应头进行某种缓存

我的应用程序正在为后端身份验证服务使用Desive_token_auth。我们将它与循环访问令牌一起使用,因此我编写了一个在每个请求之后运行的函数

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。你可以回答你自己的问题。老兄,这是一个棘手的问题,浪费了一整天的时间试图解决它,谢谢你提出这个问题并回答它!