Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
Java http:conditional get没有机会在不再次发送正文的情况下刷新标头_Java_Http_Tomcat_Apache2_Http Headers - Fatal编程技术网

Java http:conditional get没有机会在不再次发送正文的情况下刷新标头

Java http:conditional get没有机会在不再次发送正文的情况下刷新标头,java,http,tomcat,apache2,http-headers,Java,Http,Tomcat,Apache2,Http Headers,我不知道这是一个bug还是http规范中的一个特性,或者我不太理解 我有一个资源,在一周开始时,每周最多更改一次。如果没有更改,则前一周的资源在整个星期内仍然有效 (对于我们所有的测试,我们已经将一周时间修改为五分钟,但我认为我们的观察结果仍然有效) 首先,我们发送带有标题的资源Expires:next Monday。浏览器从缓存中检索的整个星期。如果周一我们有了一个新的资源,那么它将使用新的头进行检索,并且一切正常 当资源未更新时会出现问题。作为对条件get的响应,我们的应用程序(Java+T

我不知道这是一个bug还是http规范中的一个特性,或者我不太理解

我有一个资源,在一周开始时,每周最多更改一次。如果没有更改,则前一周的资源在整个星期内仍然有效

(对于我们所有的测试,我们已经将一周时间修改为五分钟,但我认为我们的观察结果仍然有效)

首先,我们发送带有标题的资源
Expires:next Monday
。浏览器从缓存中检索的整个星期。如果周一我们有了一个新的资源,那么它将使用新的头进行检索,并且一切正常

当资源未更新时会出现问题。作为对条件get的响应,我们的应用程序(Java+Tomcat)发送了带有
Expires:next Monday
的新标题,但没有正文。但是我们的前端服务器(apache)删除了这个头,因为规范说如果资源没有改变,就不应该发送新的头。因此,现在,当我们希望浏览器继续直接从缓存中提供服务时,浏览器将永远(直到资源更改)发送一个条件get

是否有符合规范的方法来更新标题而不更新正文?(或再次发送)


子问题:如何让apache传递tomcat的头?

仅仅一个
Expires
头是不够的。根据第13.3.4节,服务器需要响应两个标题,
Last Modified
ETag
,以实现条件正确:

换句话说,HTTP/1.1源服务器的首选行为是发送强实体标记和上次修改的值

如果客户机兼容HTTP/1.1,那么它应该发送
(如果自
以来进行了修改)。然后服务器应该做出如下响应(引用Roy Fielding的话):

  • 如果资源不可访问(无论出于何种原因),那么服务器应该像现在一样返回4XX消息
  • 如果资源不再存在,服务器应返回404 Not Found响应(即与现在相同)
  • 如果资源可访问,但其最后修改日期早于(小于)或等于传递的日期,则服务器应返回304 Not MODIFED消息(无正文)
  • 如果资源是可访问的,并且其最后修改日期晚于传递的日期,则服务器应返回一条200 OK消息(即与现在相同)和正文

因此,我想您不需要按照您描述的方式配置Apache和/或Tomcat。您需要使应用程序符合HTTP/1.1。

尝试为标头发送有效的URI?

解决此问题的一种方法是每周使用单独的URI。规范url重定向到该周的相应url,并指示浏览器将重定向缓存一周。此外,包含日期的URL将指示浏览器永久缓存

规范URL:/path/to/resource


Status Code : 301
Location : /path/to/resource/12-dec or /path/to/resource/19-dec
Expires : Next Monday
第一周:/path/to/resource/12月12日


Status code : 200
Expires : Never

Status code : 200
Expires : Never
第2周:/path/to/resource/12月19日


Status code : 200
Expires : Never

Status code : 200
Expires : Never
当缓存在周一到期时,您只需发送重定向响应。您可以发送上周的URL,也可以发送本周的URL,但您永远不会发送整个响应正文

通过这种方法,您消除了条件get。您还使您的资源“发布后不可修改”,并且您还获得了版本化的资源


尽管http规范要求缓存重定向,但并非所有浏览器都缓存重定向。值得注意的是,IE8及以下版本不缓存。有关详细信息,.

HTTP 1.1基本上不推荐使用
Expires
头;改用
缓存控制:最大年龄

确保包括上次修改的

这是可选的,但您可能还需要指定
缓存控制:必须重新验证
,以确保中间代理不会提供可能过时的内容

您不需要设置
ETag

请求示例:

GET http://localhost/images/logo.png HTTP/1.1
Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5
Referer: http://localhost/default.aspx
Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Host: localhost
Connection: Keep-Alive
响应包括请求的内容:

HTTP/1.1 200 OK
Cache-Control: max-age=10
Content-Type: image/png
Last-Modified: Sat, 21 Feb 2009 11:28:18 GMT
Accept-Ranges: bytes
Date: Sun, 18 Dec 2011 05:48:34 GMT
Content-Length: 2245
在10秒超时之前发出的请求从缓存中解析,没有HTTP请求。超时后:

GET http://localhost/images/logo.png HTTP/1.1
Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5
Referer: http://localhost/default.aspx
Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
If-Modified-Since: Sat, 21 Feb 2009 11:28:18 GMT
Host: localhost
响应只是标题,没有内容:

HTTP/1.1 304 Not Modified
Cache-Control: max-age=10
Last-Modified: Sat, 21 Feb 2009 11:28:18 GMT
Accept-Ranges: bytes
Date: Sun, 18 Dec 2011 05:49:04 GMT

后续请求将再次从浏览器缓存解析,直到指定的缓存过期时间。

到目前为止,是否真的值得优化?每周只发送一次邮件已经得到了很好的优化。正文占用带宽吗?您应该显示响应/请求+响应代码中的标题,304响应(未修改)不会阻止使用新标题,而且它必须包含日期标题,无论如何。@JBNizet我相信他的问题是,如果资源被修改,浏览器现在将重新检查每次访问,因为它没有收到更新的“下周一重试”。浏览器只看到“文件已超过7天,我必须重试”。一个解决方法可能是每周强制发送一次,即强制每周一发送一个“新”版本,即使它实际上是相同的。@匿名,每次检查都可以,现在很多浏览器在每次停止/启动时都可以转储缓存,所以缓存是一个优化提示,您不应该太依赖它。如果客户端(浏览器)支持管道连接,那么每次检查都是非常便宜的。好吧,特别是在资源经常变化的现代网站上,缓存对于会话加速来说是最重要的。但他的情况可能不是这样。不过,我想解决方案可能是使用HTTP之外的自定义到期模型。请参阅RFC 2612的第10.3.5节。它说需要的是ETag和Date,可以包括Expires、缓存控制和/或Vary。“首选行为”并不意味着这是一个要求。如果修改了,则不需要为发送ETag标头,因为这样才能正常工作。@RickNZ您是对的,是的<代码>ETag
为n