我读取Cache-Control标头的'private'指令的定义是它将阻止响应的任何部分被中间代理缓存.基于此,听起来好像我正在使用'private'指令,那么就不需要使用'no-cache ="set-cookie"'指令来告诉中间代理禁止Set-Cookie的缓存头.
原始服务器应发送以下附加的HTTP/1.1响应头,具体取决于具体情况:
要禁止Set-Cookie标头的缓存:Cache-control:no-cache ="set-cookie".
以及以下之一:
禁止在共享缓存中缓存私有文档:缓存控制:私有.
[...]
我在网上看到了大量有两个指令的例子.
那么我真的需要这两个来阻止中间代理缓存Set-Cookie头吗?我一直在做一些测试,似乎Internet Explorer通过每次发出一个完整的请求来响应'no-cache ="set-cookie"'指令,所以如果它不是,我宁愿不包括它必要.
假设我使用@GET方法调用以下Web服务:
@GET
@Path(value = "/user/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getUserCache(@PathParam("id") String id, @Context HttpHeaders headers) throws Exception {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("id", id);
SqlSession session = ConnectionFactory.getSqlSessionFactory().openSession();
Cre8Mapper mapper = session.getMapper(Cre8Mapper.class);
// slow it down 5 seconds
Thread.sleep(5000);
// get data from database
User user = mapper.getUser(map);
if (user == null) {
return Response.ok().status(Status.NOT_FOUND).build();
} else {
CacheControl cc = new CacheControl();
// save data for 60 seconds
cc.setMaxAge(60);
cc.setPrivate(true);
return Response.ok(gson.toJson(user)).cacheControl(cc).status(Status.OK).build();
}
}
Run Code Online (Sandbox Code Playgroud)
为了实验,我在从数据库中获取数据之前5秒放慢当前线程的速度. …
以下三个.htaccess规则之间的区别是什么以及何时使用每个规则,是否有任何特殊用例更喜欢其中一个?:
Header set Cache-Control "max-age=290304000"
Header set Expires "Thu, 15 Apr 2020 20:00:00 GMT"
ExpiresDefault "access plus 10 years"
Run Code Online (Sandbox Code Playgroud) 根据AuthorizationOAuth规范包含标头的Web服务器的响应,HTTP缓存是否有用?
Request1 Authorization : AUTHTOKEN
Request2 Authorization : ANOTHERAUTOTOKEN
Run Code Online (Sandbox Code Playgroud)
在这种情况下,给定HTTP缓存,第二个请求将返回第一个用户的缓存响应.对于跨用户通用的内容而言,这不是问题,但是对于共享缓存为其他用户提供响应而言,这是错误的.
同样,如果我们使用Vary标头并改变Authorization,这意味着我们的缓存将为每个标记存储一个缓存副本,这肯定会破坏HTTP缓存的目的.浏览器本地缓存(私有)可以正常工作,但这仍然意味着每个会话至少一次来自每个用户的原始请求.
编辑
有问题的服务需要对所有请求进行授权,但是根据我所阅读的内容,除非存在must-revalidate,public和s-maxage,否则不应该从包含授权标头的共享缓存中提供响应.
因此,我的问题是,鉴于API既具有通用性(所有用户的响应相同),又具有用户特定的响应,甚至可以进行缓存?拥有s-maxage和公共标头但是授权标头意味着如果我正确地遵循RFC,缓存将解决UserA对UserB,UserC等的响应.
我最近遇到了一个名为Varnish的http网络加速器.根据我的阅读,Varnish通过使用反向代理配置优化与HTTP服务器的HTTP通信的每个进程来加速网站的交付.
我的问题是,如果你有一个具有它的缓存机制配置一路下跌到静态html文件的网站,那么多少的效果光油对吗?反向代理是否会削减HTTP服务器处理请求所执行的工作?如果您在服务器端广泛缓存了所有内容(HTTP标头,Etags,过期标头,数据库缓存,片段和页面缓存),那么HTTP加速器还会做些什么来改进这一点?
是否可以通过安全的HTTPS连接将HTTP缓存用于条件GET请求?我已经通过非安全HTTP进行缓存,但是当我切换到HTTPS时,浏览器会停止发送if-none-match和if-modified-since标头,因此缓存会中断.我尝试了各种Cache-Control设置,如public,max-age = 3600和whatnot,no dice.
这种情况在Safari和Chrome中都会发生,因此我假设SSL以某种方式打破了它.是否不允许通过SSL进行缓存?
而且要明确的是,服务器确实正确设置了etag和最后修改的标头,但根据Chrome开发人员的工具,浏览器不会在请求中发送if-none-match和if-modified-since.
谢谢你的帮助.
我无法找到Retrofit默认行为的好解释.
如果Okhttp在类路径上,它将自动使用.但据我所知,默认的HttpResponseCache为null.
我是否需要使用Retrofit和Okhttp显式启用缓存?
我用来避免解析遍地的服务器响应,如果它也不会改变通过计算响应的哈希值:
public class HttpClient {
protected OkHttpClient mClient = new OkHttpClient();
public String get(final URL url, final String[] responseHash)
throws IOException {
HttpURLConnection connection = new OkUrlFactory(mClient).open(url);
InputStream inputStream = null;
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
assert messageDigest != null;
try {
// Read the response.
inputStream = connection.getInputStream();
byte[] response = readFully(inputStream);
final byte[] digest = messageDigest.digest(response);
responseHash[0] = Base64.encodeToString(digest, Base64.DEFAULT);
return …Run Code Online (Sandbox Code Playgroud) 我有一个简单的 ASP.NET Core 2.2 Web Api 控制器:
[ApiVersion("1.0")]
[Route("api/[controller]")]
[ApiController]
public class TestScenariosController : Controller
{
[HttpGet("v2")]
public ActionResult<List<TestScenarioItem>> GetAll()
{
var entities = _dbContext.TestScenarios.AsNoTracking().Select(e => new TestScenarioItem
{
Id = e.Id,
Name = e.Name,
Description = e.Description,
}).ToList();
return entities;
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用@angular/common/http以下命令从 angular 应用程序查询此操作时:
this.http.get<TestScenarioItem[]>(`${this.baseUrl}/api/TestScenarios/v2`);
Run Code Online (Sandbox Code Playgroud)
在 IE11 中,我只得到缓存的结果。
如何禁用所有 web api 响应的缓存?
http-caching ×10
http ×5
caching ×4
http-headers ×2
okhttp ×2
retrofit ×2
.htaccess ×1
android ×1
apache ×1
asp.net-core ×1
c# ×1
chromium ×1
etag ×1
java ×1
jax-rs ×1
reload ×1
response ×1
ssl ×1
varnish ×1
web-services ×1