java-Mongodb IsoDate和微服务上if-modified-since的问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-Mongodb IsoDate和微服务上if-modified-since的问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2216字,纯文字阅读大概需要4分钟。
内容图文
![java-Mongodb IsoDate和微服务上if-modified-since的问题](/upload/InfoBanner/zyjiaocheng/886/d23602ccd5d447778262c369927bf755.jpg)
当我使用spring数据在MongoDB上插入文档时,请执行以下操作:
Update update = new Update();
update.currentDate("lastModified");
mongoTemplate.upsert(query, update, MyDocument.class);
我使用的是MongoDB的currentDate,因为我想将MyDocument的最后修改日期保存为我的MongoDB数据库所在的日期.
基于spec:
The If-Modified-Since request-header field is used with a method to
make it conditional: if the requested variant has not been modified
since the time specified in this field, an entity will not be
returned from the server; instead, a 304 (not modified) response will
be returned without any message-body.
因此,保存此日期的目的是根据收到的日期来验证MyDocument是否已修改.
因此,当我执行更新时,将在数据库上创建以下IsoDate:
ISODate("2016-12-02T12:11:33.083Z")
因此,当客户想知道文档是否已更改时,他们将这个日期发回给我,并在数据库上查询:
Query query = new Query(where("id").is(filter.getId()));
Criteria criteria = Criteria.where("lastModified").gt(filter.getLastModified());
query.addCriteria(criteria);
return mongoTemplate.findOne(query, MyDocument.class);
除一个问题外,此方法运行完美:规范说标头if-modified-since具有以下格式:
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
这意味着毫秒不会在if-modified-since标头上传递.但是,MongoDB IsoDate会以毫秒为单位保存当前日期.因此,当两个日期完全相同时,查询将不会返回304 Not Modified,但它将返回整个资源,因为查询将是以下内容:
{ "id" : 123, "lastModified" : { "$gt" : { $java : 2016-12-02T12:11:39.000Z } } }
由于客户端不发送毫秒,因此Java将毫秒设置为零(2016-12-02T12:11:39.000Z),这意味着
我的数据库上的日期大于我的客户发送的日期:
2016-12-02T12:11:33.083Z> 2016-12-02T12:11:39.000Z
因为83毫秒.
最后一个问题是:什么是解决此问题并按照if-modified-since规范所建议的那样正确工作的正确方法?
解决方法:
您可以将最后修改的日期毫秒数设置为比较前的最大毫秒数,这从技术上将抵消毫秒数的偏移量.
public static Date setMaxMillis(Date day,Calendar cal) {
cal.setTime(day);
cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));
return cal.getTime();
}
Query query = new Query(where("id").is(filter.getId()));
Criteria criteria = Criteria.where("lastModified").gt(setMaxMillis(filter.getLastModified(),Calendar.getInstance()));
query.addCriteria(criteria);
return mongoTemplate.findOne(query, MyDocument.class);
内容总结
以上是互联网集市为您收集整理的java-Mongodb IsoDate和微服务上if-modified-since的问题全部内容,希望文章能够帮你解决java-Mongodb IsoDate和微服务上if-modified-since的问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。