Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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 如何有效地检查图片存储库网站的更改?_Java_Resttemplate_Spring Web - Fatal编程技术网

Java 如何有效地检查图片存储库网站的更改?

Java 如何有效地检查图片存储库网站的更改?,java,resttemplate,spring-web,Java,Resttemplate,Spring Web,我目前正在开发一个同步服务,从exchange服务器获取所有用户配置文件图片。 为了跟踪更改,我决定对响应体进行MD5编码,并将其与数据库中的实体保持一致,以便在路径上进一步比较,查看图片是否已更改。而实际图片本身保存在磁盘上 图片大小为504x504像素,因此重量约为27 kb。 由于我要获取字节码的散列值,即使图片匹配,我仍然必须下载27kb的数组,这几乎没有任何速度提升(除了我不需要在磁盘上替换它)。乘以大量用户,即使所有图片都匹配,这项工作也需要20分钟 有没有办法优化同步,以便在图片相

我目前正在开发一个同步服务,从exchange服务器获取所有用户配置文件图片。 为了跟踪更改,我决定对响应体进行MD5编码,并将其与数据库中的实体保持一致,以便在路径上进一步比较,查看图片是否已更改。而实际图片本身保存在磁盘上

图片大小为504x504像素,因此重量约为27 kb。 由于我要获取字节码的散列值,即使图片匹配,我仍然必须下载27kb的数组,这几乎没有任何速度提升(除了我不需要在磁盘上替换它)。乘以大量用户,即使所有图片都匹配,这项工作也需要20分钟

有没有办法优化同步,以便在图片相同时不下载响应正文? 以下是一些有助于您更好理解的代码:

entity = restTemplate.getForEntity(
                Constant.EXCHANGE_URL_PREFIX + emailAddress + Constant.EXCHANGE_URL_SUFFIX, byte[].class);
这就是我调用get请求的方式

if (entity.hasBody()) {
 String hexHash = Hex.encodeHexString(MessageDigest.getInstance("MD5").digest(bytes));
 if (!listofHashes.contains(hexHash)) {
    picture.remove();
 } else picture.save();
}
总而言之:有没有一种方法可以使用restTemplate检测网页更改,而不下载整个页面?先谢谢你


编辑:对ETag头和@Cacheable注释的额外研究没有证明是成功的。

这实际上取决于您与之通信的服务器的功能。如果该服务器不支持任何(、等,如注释中所述)或发送任何其他自定义标头,则您别无选择,只能执行所述操作-计算客户端(应用程序中)的响应正文摘要。

这实际上取决于您与之通信的服务器的功能。如果该服务器不支持任何(、等,如注释中所述)或发送任何其他自定义标头,则您别无选择,只能执行所述操作-计算客户端(应用程序中)响应正文的摘要。

您可以尝试使用HTTP GET,但只能请求标头

然后,从回复中验证“内容长度”和“上次修改”(如果它们与您已存储的图像不匹配,则必须再次下载)

例如,对维基百科中的一个图像执行此操作时,我得到以下结果:

内容长度:314402 最后修改时间:2013年10月31日星期四14:45:43 GMT

请注意,关于“内容长度”:

Content-Length-entity-header字段表示发送给收件人的实体体的大小(以十进制八位字节为单位),或者在HEAD方法的情况下,表示如果请求是GET,则会发送的实体体的大小。(详见此处:)

这是我使用的curl命令:

$ curl -X HEAD -I "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/            Lifeboat.17-31.underway.arp.jpg/1200px-Lifeboat.17-31.underway.arp.jpg"

HTTP/2 200 
date: Thu, 29 Jun 2017 08:30:29 GMT
content-type: image/jpeg
content-length: 314402
x-object-meta-sha1base36: oboqyviefa9uqy9p7391dxgod784onh
last-modified: Thu, 31 Oct 2013 14:45:43 GMT
etag: 188492bd99a0032624df62205d156bb4
x-timestamp: 1383230742.02258
x-trans-id: tx73ff02723dc5476c92e0a-005953e448
x-varnish: 894182014 897225224, 41759639 11075541, 415722130
via: 1.1 varnish-v4, 1.1 varnish-v4, 1.1 varnish-v4
accept-ranges: bytes
age: 54876
x-cache: cp1063 hit/1, cp3045 hit/72, cp3049 pass
x-cache-status: hit
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-analytics: https=1;nocookies=1
x-client-ip: 82.181.132.52
access-control-allow-origin: *
access-control-expose-headers: Age, Date, Content-Length, Content-Range, X-Content-    Duration, X-Cache, X-Varnish
timing-allow-origin: *

您可以尝试使用HTTP GET,但只能请求头

然后,从回复中验证“内容长度”和“上次修改”(如果它们与您已存储的图像不匹配,则必须再次下载)

例如,对维基百科中的一个图像执行此操作时,我得到以下结果:

内容长度:314402 最后修改时间:2013年10月31日星期四14:45:43 GMT

请注意,关于“内容长度”:

Content-Length-entity-header字段表示发送给收件人的实体体的大小(以十进制八位字节为单位),或者在HEAD方法的情况下,表示如果请求是GET,则会发送的实体体的大小。(详见此处:)

这是我使用的curl命令:

$ curl -X HEAD -I "https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/            Lifeboat.17-31.underway.arp.jpg/1200px-Lifeboat.17-31.underway.arp.jpg"

HTTP/2 200 
date: Thu, 29 Jun 2017 08:30:29 GMT
content-type: image/jpeg
content-length: 314402
x-object-meta-sha1base36: oboqyviefa9uqy9p7391dxgod784onh
last-modified: Thu, 31 Oct 2013 14:45:43 GMT
etag: 188492bd99a0032624df62205d156bb4
x-timestamp: 1383230742.02258
x-trans-id: tx73ff02723dc5476c92e0a-005953e448
x-varnish: 894182014 897225224, 41759639 11075541, 415722130
via: 1.1 varnish-v4, 1.1 varnish-v4, 1.1 varnish-v4
accept-ranges: bytes
age: 54876
x-cache: cp1063 hit/1, cp3045 hit/72, cp3049 pass
x-cache-status: hit
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-analytics: https=1;nocookies=1
x-client-ip: 82.181.132.52
access-control-allow-origin: *
access-control-expose-headers: Age, Date, Content-Length, Content-Range, X-Content-    Duration, X-Cache, X-Varnish
timing-allow-origin: *
条件GET 如果您的服务器实现了,则可以使用以下对之一来实现:

  • 上次修改/如果自
  • ETag/如果不匹配
若etag匹配或自上次获取日期以来未修改,服务器应返回304(未修改)

示例: 请求标头:

If-Modified-Since:Sat, 06 Aug 2016 05:22:27 GMT
If-None-Match:"02c7fd69fa875302f71b714fa2787cc95fa88245"
响应标题:

Last-modified:Sat, 04 Apr 2015 09:05:44 GMT
Etag: "02c7fd69fa875302f71b714fa2787cc95fa88245"
结论
  • 实际上,您所做的应该由您的exchange服务器而不是客户端来完成,这就是304的目的
  • 最后一种修改方式会受到分布式系统中时间漂移的影响,而Etag不会受到影响
  • 另一方面,Etag可能涉及文件系统的inode信息,因此移动文件也可能影响Etag值
裁判
条件获取 如果您的服务器实现了,则可以使用以下对之一来实现:

  • 上次修改/如果自
  • ETag/如果不匹配
若etag匹配或自上次获取日期以来未修改,服务器应返回304(未修改)

示例: 请求标头:

If-Modified-Since:Sat, 06 Aug 2016 05:22:27 GMT
If-None-Match:"02c7fd69fa875302f71b714fa2787cc95fa88245"
响应标题:

Last-modified:Sat, 04 Apr 2015 09:05:44 GMT
Etag: "02c7fd69fa875302f71b714fa2787cc95fa88245"
结论
  • 实际上,您所做的应该由您的exchange服务器而不是客户端来完成,这就是304的目的
  • 最后一种修改方式会受到分布式系统中时间漂移的影响,而Etag不会受到影响
  • 另一方面,Etag可能涉及文件系统的inode信息,因此移动文件也可能影响Etag值
裁判

很可能,但不能保证服务器会发送这些信息。我已经比较了多个请求头,除了请求id,其他字段都是相同的。您是否尝试执行
请求,而不是
获取
并检查响应头?您是否尝试发送请求中的
If-Modified-Since
标头?@yinon我尝试发送If-Modified-Since,但不是HEAD请求,可能会对其进行检查,但无法保证服务器发送该信息是偶然的。除了请求id之外,我还比较了多个请求标头,其他字段是相等的。您是否尝试执行
HEAD
请求而不是
GET
并检查响应头?您是否尝试发送请求中的
If Modified Since
标题?@yinon我尝试发送If Modified Since,但不是HEAD请求,将对此进行调查谢谢,我将尝试发送条件headertha