我正经历着我的客户在向我的服务器提出一个无辜的请求后被注销。我控制两端,经过大量调试后,我发现发生了以下情况:
304 Not Modified进行响应。据我所知,浏览器不能缓存任何包含授权的请求。尽管如此,
chrome://view-http-cache/http://localhost:10080/api/SearchHost显示
HTTP/1.1 200 OK
Date: Thu, 23 Nov 2017 23:50:16 GMT
Vary: origin, accept-encoding, authorization, x-role
Cache-Control: must-revalidate
Server: 171123_073418-d8d7cb0 =
x-delay-seconds: 3
Authorization: Wl6pPirDLQqWqYv
Expires: Thu, 01 Jan 1970 00:00:00 GMT
ETag: "zUxy1pv3CQ3IYTFlBg3Z3vYovg3zSw2L"
Content-Encoding: gzip
Content-Type: application/json;charset=utf-8
Content-Length: 255有趣的服务器头用一些内部信息代替Jetty服务器头(出于安全原因不应该使用它)--忽略它。卷曲是这么说的:
< HTTP/1.1 304 Not Modified
< Date: Thu, 23 Nov 2017 23:58:18 GMT
< Vary: origin, accept-encoding, authorization, x-role
< Cache-Control: must-revalidate
< Server: 171123_073418-d8d7cb0 =
< ETag: "zUxy1pv3CQ3IYTFlBg3Z3vYovg3zSw2L"
< x-delay-seconds: 3
< Content-Encoding: gzip这种情况也发生在Firefox中,尽管我目前无法复制它。RFC继续说,看起来上面链接的答案并不准确:
除非响应中存在允许存储此类响应的缓存指令。
看起来响应是可缓存的。这很好,我确实希望缓存内容,但我不希望从缓存中为授权头提供服务。这个是可能的吗?
解释我的问题
我的服务器过去只在响应登录请求时才发送Authorization头。这过去工作得很好,新的要求带来了问题。
我们的网站允许用户任意长时间登录(我们不做敏感业务)。我们正在更改授权令牌的格式,因此我们不希望强迫所有用户再次登录。因此,每当服务器看到过时但有效的授权令牌时,它就会发送更新的授权令牌。因此,现在任何响应都可能包含授权令牌,但大多数响应不包含授权令牌。
浏览器缓存结合了仍然有效的响应和过时的授权令牌。
作为解决办法,我让服务器在出现授权令牌时不发送etag。很管用,但我更喜欢一些更干净的解决方案。
发布于 2017-12-10 23:54:54
我的当前解决方案是在每个响应中发送一个授权头;当不需要授权时,使用-的占位符值。
占位符值显然是没有意义的,客户端知道它,并且很高兴地忽略它。
这个解决方案很难看,因为它为每个响应增加了大约20个字节,但这仍然比偶尔重新发送整个响应内容要好,就像我在问题中提到的方法一样。此外,对于HTTP/2,它将是免费的。
https://stackoverflow.com/questions/47464893
复制相似问题