Javascript 当访问控制允许标头中不允许缓存控制标头时,如何绕过浏览器缓存

Javascript 当访问控制允许标头中不允许缓存控制标头时,如何绕过浏览器缓存,javascript,http,cors,github-api,fetch-api,Javascript,Http,Cors,Github Api,Fetch Api,我正在使用GithubAPI请求需要最新的通知。问题是,我的浏览器经常从浏览器缓存而不是从互联网加载对我的请求的响应,当然,互联网不是最新的。 为了防止这种情况发生,并告诉浏览器不要使用缓存,我读到应该使用缓存控件标题。 问题是GitHub API在其访问控制允许头中似乎没有缓存控制头,因此我不允许在请求中使用缓存控制头 那么,如果不允许我使用缓存控件标题,我该如何防止浏览器从缓存加载响应呢?为什么GithubAPI首先禁止缓存控制头,有什么好的理由吗 为了提供更多的上下文,我在JavaScri

我正在使用GithubAPI请求需要最新的通知。问题是,我的浏览器经常从浏览器缓存而不是从互联网加载对我的请求的响应,当然,互联网不是最新的。 为了防止这种情况发生,并告诉浏览器不要使用缓存,我读到应该使用
缓存控件
标题。 问题是GitHub API在其
访问控制允许头中似乎没有
缓存控制
头,因此我不允许在请求中使用
缓存控制

那么,如果不允许我使用
缓存控件
标题,我该如何防止浏览器从缓存加载响应呢?为什么GithubAPI首先禁止
缓存控制
头,有什么好的理由吗

为了提供更多的上下文,我在JavaScript中使用了FetchAPI,并尝试了下面的代码

res = await fetch('https://api.github.com/notifications', {method: 'Get', 
    headers: {    
        'accept': 'application/vnd.github.v3+json', 
        'authorization': "token " + token,  
        'Cache-Control': 'no-cache'               
}});
我得到了错误信息:

访问从源获取“”的权限 “”已被CORS策略阻止:请求 不允许使用标头字段缓存控制 访问控制允许飞行前响应中的标头


您能为我的问题推荐最好的解决方案吗?

所以我通过在请求中使用查询参数,借助zero298 comment解决了这个问题

let cachebust = window.localStorage.getItem("cachebust253");
if(cachebust === null) {cachebust = 0;}
res = await fetch('https://api.github.com/notifications?cache_bust=${cachebust}', {method: 'Get', 
    headers: {    
        'accept': 'application/vnd.github.v3+json', 
        'authorization': "token " + token,                
}});
window.localStorage.setItem("cachebust253", parseInt(cachebust)+1);
编辑:但这不是有效的解决方案,因为github不遵守GithubAPI策略。我们必须尊重github api的x-poll-interval头,正如dezfowler在github文档上指出的那样

通知针对使用上次修改的标头进行轮询进行了优化。如果没有新的通知,您将看到一个304 Not Modified响应,保持您当前的费率限制不变。有一个X-Poll-Interval标头,指定允许轮询的频率(以秒为单位)。在服务器负载较高时,时间可能会增加。请遵守标题

他们还提供了使用curl

#为您的请求添加身份验证
curl-Ihttps://api.github.com/notifications
HTTP/1.1200ok
最后修改时间:2012年10月25日星期四格林威治标准时间15:16:27
X-轮询间隔:60
#准确传递最后修改的标题
curl-Ihttps://api.github.com/notifications
-H“如果修改自:2012年10月25日星期四15:16:27 GMT”
HTTP/1.1 304未修改
X-轮询间隔:60
他们使用的是
Last Modified
标题,其中包含通知上次更新的日期。如果自
头修改,则使用
将该日期回显到请求中的服务器,如果内容未更改,则返回“304未修改”状态响应,不包含任何内容

正如本文所述,它们还提供一个轮询间隔标头,您应该读取该标头,并确保通知更新功能的运行频率不会超过指定的间隔,在它们的示例中,该间隔为“60”(秒),表示“不超过每分钟一次”


另一个答案上有一个注释-您绝对不应该使用缓存半身像查询参数。GitHub提供了一种机制来控制缓存,并控制服务器上的负载以保持可用性。忽略这一点会给每个人都带来问题,并且可能违反他们的使用条款。

您可以尝试使用查询参数破坏缓存吗<代码>https://api.github.com/notifications?cachebust=123456
?请参阅我的答案。GitHub API中提供了一种正确的方法来实现这一点。谢谢,希望稍后在X-Poll-Interval中构建。在开发的这个阶段,我想保持它的简单性,直到我了解了基本的东西。话虽如此,难道你不能在一分钟后仍然使用cache-bust查询参数来确保缓存被忽略吗?如果你使用这个参数,你将使一个非常好的缓存版本失效。如果事情真的发生了变化,那么你只需要下载通知和更新东西,这就是如果修改后的结果。Cache bust每次都会盲目下载通知。