在上一个博客中,我们讨论了不同类型的缓存及其用例。
在本文中,我们将探讨如何利用HTTP响应标头和JAX-RS提供的支持来利用缓存。

过期标题

在HTTP 1.0中,一个名为Expires的简单响应头将告诉浏览器它可以缓存对象或页面多长时间。 在将来的某个日期之后,缓存将无效。 因此,如果我们进行API调用以检索数据:

GET /users/1

响应头为:

HTTP/1.1 200 OK
Content-Type: application/xml
Expires: Tue, 25 Aug 2013 16:00 GMT
-----
<user id="1">...</users>

这表示XML资料的有效期至格林尼治标准时间2013年8月25日16:00。

JAX-RS在javax.ws.rs.core.Response对象中支持此标头。

@Path("{id}")@GET@Produces(MediaType.APPLICATION_XML)public Response getUserXML(@PathParam("id") Long id){User user = userDB.get(id);ResponseBuilder builder = Response.ok(user,MediaType.APPLICATION_XML);//Putting expires header for HTTP broswer caching.Calendar cal = Calendar.getInstance();cal.set(2013,7,25,16,0);builder.expires(cal.getTime());return builder.build();}

但是,为了支持CDN,代理缓存和重新验证,需要具有功能更丰富,具有更明确控件的增强标题。 因此,在HTTP 1.1中,引入了一些新的标头,并对Expires进行了描述。 让我们探索它们。

缓存控制

Cache-Control有一组可变的逗号分隔指令,用于定义谁,如何以及可以缓存多长时间。 让我们探索其中的几个:

  • private / public :这是可访问性指令,private表示浏览器可以缓存对象,但代理或CDN不能,而public则使所有人均可访问。
  • -无缓存,无存储,最大使用期限-很少有人用名字讲述故事。

JAX-RS提供javax.ws.rs.core.CacheControl类来表示此标头。

@Path("{id}")@GET@Produces(MediaType.APPLICATION_XML)public Response getUserXMLwithCacheControl(@PathParam("id") Long id){User user = userDB.get(id);CacheControl cc = new CacheControl();cc.setMaxAge(300);cc.setNoStore(true);cc.setPrivate(true);ResponseBuilder builder = Response.ok(user,MediaType.APPLICATION_XML);builder.cacheControl(cc);return builder.build();}

重新验证和条件GET :缓存过期后,缓存器可以重新验证缓存,向服务器发送请求以检查缓存是否陈旧或保持良好状态。 这是通过名为“ Last-Modified ”的标头完成的。

HTTP/1.1 200 OK
....
Cache-Control: max-age=1000
Last-Modified: Mon, 19 aug 2013 16:00 IST

要重新验证,必须发送带有标头“ If-modified-since ”的GET请求。这称为条件GET,如果数据被修改,则将发送具有当前资源值的响应代码200(OK)。 如果未修改数据,则发送响应代码“ 304”,这表示高速缓存仍然有效,此时可以更新“上次修改”标签。

埃塔格

Etag是另一个HTTP标头,可用于重新验证缓存,它通常是MD5哈希值。 服务器将响应中从资源生成的哈希作为Etag值发送,以便在验证时,客户端可以将其Etag值发送给服务器以检查驻留在服务器上的值是否匹配。(由于哈希是从资源生成的,因此请更改资源中会生成不同的哈希值)

对于此条件GET,发送带有标头“ If-none-Match”的请求以进行验证。

GET /users/23 HTTP/1.1
If-None-Match: "23432423423454654667444"

此外,根据不同的用例,我们可以具有强弱的Etag值。

JAX-RS为我们提供了相同的javax.ws.rs.core.EntityTag。

public class EntityTag {
.....
.....

为了帮助有条件的GET,JAX-RS还提供了一个可注入的帮助程序类Request,它具有以下方法:

....
ResponseBuilder evalutatePostConditions(EntityTag eTag);
ResponseBuilder evaluatePreConditions(Date isLastModified);
.....

比较请求标头中发送的etag或LastModified值。 让我们看一个例子……

@Path("{id}")@GET@Produces(MediaType.APPLICATION_XML)public Response getUserWithEtagSupport(@PathParam("id") Long id,@Context Request request){User user = userDB.get(id);//generating Etag out of hashCode of userEntityTag tag = new EntityTag(Integer.toString(user.hashCode()));CacheControl cc = new CacheControl();cc.setMaxAge(1000);ResponseBuilder builder = request.evaluatePreconditions(tag);if(builder!=null){//means the preconditions have been met and the cache is valid//we just need to reset the cachecontrol max age (optional)builder.cacheControl(cc);return builder.build();}//preconditions are not met and the cache is invalid//need to send new value with reponse code 200 (OK)builder = Response.ok(user,MediaType.APPLICATION_XML);//reset cache control and eTag (mandatory)builder.cacheControl(cc);builder.tag(tag);return builder.build();}

如果满足条件,则返回空值,这意味着最新标记和请求标头中提供的标记匹配,并且无需发送响应为OK的新数据。 发送“ 304”响应,表示未修改。

如果标签不匹配,则返回一个新的RequestBuilder对象,在其中设置新的etag和当前数据版本(在这种情况下为用户)。

这就是使用JAX-RS可以有效利用HTTP缓存发挥其全部潜力的方式。

参考:来自anirudh bhatnagar博客的JCG合作伙伴 Anirudh Bhatnagar 使用JAX-RS进行HTTP缓存 。

翻译自: https://www.javacodegeeks.com/2013/10/http-caching-using-jax-rs.html

使用JAX-RS的HTTP缓存相关推荐

  1. jax rs mysql_Jersey / JAX-RS ExceptionMapper MySQL

    我正在学习Jersey / JAX-RS,我需要一些ExceptionMapper的帮助 . 我有一个UserFacade类,AbstractFacade类和User类本身,都非常标准,主要是通过在N ...

  2. jax rs mysql_liferay7-rest开发JAX-RS规范详解

    简介 JAX-RS (JSR-311) 是为 Java EE 环境下的 RESTful 服务能力提供的一种规范.它能提供对传统的基于 SOAP 的 Web 服务的一种可行替代. 在本文中,了解 JAX ...

  3. jax rs mysql_JAX-RS示例(Jersey)

    我们可以通过 jersey 实现创建JAX-RS示例. 为此,需要加载 jersey相关jar文件或使用Maven框架. 在这个例子中,我们使用jersey jar文件来实现JAX-RS jersey ...

  4. 泽西岛/贾克斯RS:流式JSON

    大约一年前,我写了一篇博客文章,展示了如何使用Jersey / Jax RS流式传输HTTP响应 ,最近我想做同样的事情,但是这次使用JSON. 一种常见的模式是获取我们的Java对象并获​​取该对象 ...

  5. Drools 5.1.1(一)

    http://shikonglaike.iteye.com/blog/1236354 第一章欢迎 我总是和终端业务用户争论不休,理解规则和流程.最新规则和事件处理的区别.对此,在他们的意识中有这样的问 ...

  6. 多云架构落地设计和实施方案【华为云分享】

    [摘要] 本文介绍了如何落地多云架构,介绍了主要的技术架构和工作量分析,以及多云架构的挑战. 总体思路 不同云厂商提供的云服务不尽相同,相同的云服务在功能.性能上也会有或多或少的差异.越是深度使用某个 ...

  7. 使用 Zipkin 和 Brave 实现分布式系统追踪(基础篇

    主题 分布式系统 MySQL 一.Zipkin 1.1.简介 Zipkin 是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dappe ...

  8. 华为云设计语言_多云架构落地设计和实施方案【华为云分享】

    [摘要] 本文介绍了如何落地多云架构,介绍了主要的技术架构和工作量分析,以及多云架构的挑战. 总体思路 不同云厂商提供的云服务不尽相同,相同的云服务在功能.性能上也会有或多或少的差异.越是深度使用某个 ...

  9. 多云架构落地设计和实施方案

    "不要把鸡蛋放在同一个篮子里"是一条知名的商业准则,在云平台选择上,很多公司也遵循这样的准则.基于多云平台构筑"业务中台"并不是一件简单的事情,需要构建一种快速 ...

  10. Apache基金会项目介绍

    项目名称 描述 HTTP Server 互联网上首屈一指的HTTP服务器 Abdera Apache  Abdera项目的目标是建立一个功能完备,高效能的IETF Atom联合格式(RFC4287)和 ...

最新文章

  1. python 多个变量赋值
  2. vue+springboot-前台怎么回显本地文件夹下的图片
  3. FreeRTOS源码分析与应用开发09:低功耗Tickless模式
  4. Spring AOP介绍及源码分析
  5. 浅谈win10修复系统文件的方法
  6. JavaWeb文件上传(1)--基础
  7. AllyCAD v3.5 R12 1CD(专业CAD软件)
  8. wasatch排版教程_[2010年国内外最新最全最专业的设计软件下载.docx
  9. 卜若的代码笔记-机器学习基础-UCI数据库简介与Iris数据集分析
  10. matlab linux x11 display,Xming安裝 + X11-Forwarding使用
  11. unity3d 锁定鼠标
  12. VSCode C/C++ 使用指北
  13. 实施工作20190313
  14. 【PC工具】Samsung Magician三星固态硬盘优化维护工具升级,固态硬盘选型
  15. MyBatis中的日志(LOG4J)
  16. 使用spring boot+kubernetes构建完整微服务平台
  17. Valine 一款快速、简洁且高效的无后端评论系统
  18. 深度技术 GHOST XP SP3 快速装机专业版 V2012.03
  19. 用计算机处理信息图文,浅谈计算机技术在报纸图文信息处理中的应用
  20. 办公室的好帮手!多能办公记事本 V3.7 (20150607更新)

热门文章

  1. win10系统excel2019单元格显示完整的年月日时分秒设置方法
  2. (转)threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别
  3. 通过smack client + openfire server 实现 peer to peer communication
  4. Spring [CVE-2022-22965]漏洞处理
  5. HDU2068(错列排序)
  6. java 栈 队列 接口_Java队列接口
  7. jhipster_JHipster入门,第2部分
  8. activemq消息持久化_ActiveMQ 5.x中的消息持久性
  9. java中的方法求和_在Java中模拟求和类型的巧妙解决方法
  10. 实践与反思_在行动中反思的实践