使用JAX-RS的HTTP缓存

在上一个博客中,我们讨论了不同类型的缓存及其用例。
在本文中,我们将探讨如何利用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端模块化,AMD与CMD的区别

原创 2016年08月03日 17:15:51标签&#xff1a;javascript /模块化 /前端21234最近在研究cmd和amd&#xff0c;在网上看到一篇不错的文章&#xff0c;整理下看看。 在JavaScript发展初期就是为了实现简单的页面交互逻辑&#xff0c;寥寥数语即可&#xff1b;如今CPU、浏览器性能…

上财的计算机专业408,【2020考研】上财408分经验分享

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼数学&#xff0c;三月份到四月中旬把本科教材看了一遍。事实上还是有用的。比如&#xff0c;今年的二阶差分。看似超纲&#xff0c;其实不超纲。大纲要求认识二阶差分的形式&#xff0c;会解一阶差分方程。那道题恰好是用二阶差分表…

Linux ls命令详解

ls常见命令参数 ls: -F 给不同的文件添加不同表示,添加帽子 d/ l* s -a: 显示隐藏文件 以.开头的文件 -p: 只给目录添加/ -t: 按照修改时间排序 time --time-stylelong-iso: ls -l --time-stylelong-iso 显示友好长格式时间 -r: 倒着排序 reverse -S: 按照文件…

caffe 人脸关键点检测_人脸检测关键点新增至81个,比Dlib更精准、更贴边

人脸关键点检测是人脸识别和分析领域中的关键一步&#xff0c;它是诸如自动人脸识别、表情分析、三维人脸重建及三维动画等其它人脸相关问题的前提和突破口。虽然人脸的结构是确定的&#xff0c;由眉毛、眼睛、鼻子和嘴等部位组成&#xff0c;近似是一个刚体&#xff0c;但由于…

Jedis入门

嗨&#xff0c;这些天我开始研究Redis。 我听说过很多&#xff0c;所以我决定尝试一下。 Redis在其网站上定义为“ 开源高级键值存储”。 它通常被称为数据结构服务器&#xff0c;因为键可以包含字符串&#xff0c;哈希&#xff0c;列表&#xff0c;集合和排序集合 。 在“ S…

美团点评云真机平台实践

背景 随着美团点评业务越来越多&#xff0c;研发团队越来越庞大&#xff0c;对测试手机的需求显著增长。这对公司来说是一笔不小的开支&#xff0c;但现有测试手机资源分配不均&#xff0c;利用率也非常有限&#xff0c;导致各个团队开发、测试过程中都很难做到多机型覆盖。怎…

docker 出现 Error response from daemon

第一步&#xff1a;通过dig 114.114.114.114 registry-1.docker.io找到可用IP navydeepin:~/Desktop$ dig 114.114.114.114 registry-1.docker.io; <<>> DiG 9.11.3-1-Debian <<>> 114.114.114.114 registry-1.docker.io ; (1 server found) ;; global…

微型计算机和pc的概念,微型计算机IBM-PC(0520)系统原理及应用

本书是周明德教授的《微型计算机系统原理及应用》的第六版。曾获全国畅销书一等奖。根据微处理器的新发展&#xff0c;本书从80x86系列微处理器整体着眼&#xff0c;落实到基本的处理器8086&#xff0c;介绍了微型计算机系统原理、80x86系列微处理器结构、8086指令系统和汇编语…

vue基础篇---vue组件

vue模块第一篇&#xff0c;因为公司马上要用到这vue开发。早就想好好看看vue了。只有实际工作中用到才会进步最快。vue其他的简单指令就不多讲了&#xff0c;没啥意思&#xff0c;网上一大堆。看w3c就ok。 组件这个我个人感觉坑蛮多的&#xff0c;所以特地记录一下。 简单总结一…

volta架构 微型计算机,性能大爆炸 NVIDIA新GPU架构曝光

一年一度的GTC大会目前正在大洋彼岸的美国加利福尼亚州圣何塞市召开&#xff0c;这是由NVIDIA主办的GPU通用计算技术大会&#xff0c;号称是“图形技术巫师”们的聚会。几乎每次GTC大会上NVIDIA都会拿出来些压箱底的东西震场面&#xff0c;这届自然也不会例外。NVIDIA在GTC大会…

Java中的堆栈和队列

我最近一直在研究一些需要堆栈和队列的Java代码。 使用的选择不是立即显而易见的。 有一个Queue接口&#xff0c;但没有明确的具体实现要使用。 还有一个Stack类&#xff0c;但是javadocs指出其他类“应该优先于此类使用”。 那么&#xff0c;您对Java中的堆栈和队列使用哪种实…

有一本书,适合零到十年经验的程序员看

这本书就是《代码大全》。这书名看起来就不想读&#xff1f; 我第一次看到这个书名的时候&#xff0c;心想难道这本书要把所有编程语言都讲一遍吗&#xff1f;但是当我深入阅读这本书之后&#xff0c;简直爱不释手。 这本书太厚了&#xff0c;你看不下去&#xff1f; 是的&a…

西门子数控面板图解_学好四要点让你迅速成为数控机床“操作高手”

当前国内许多刚刚从事数控机床操作人员的分类来说&#xff0c;一部分操作者是&#xff0c;对机械加工非常熟悉&#xff0c;但对于数控机床的编程是比较陌生的&#xff1b;一部分是刚毕业的学生&#xff0c;他们对机械加工知识&#xff0c;数控加工和编程的理论比较熟悉&#xf…

Android Service、IntentService,Service和组件间通信

Service组件 Service 和Activity 一样同为Android 的四大组件之一&#xff0c;并且他们都有各自的生命周期&#xff0c;要想掌握Service 的用法&#xff0c;那就要了解Service 的生命周期有哪些方法&#xff0c;并且生命周期中各个方法回调的时机和作用 什么是service&#xff…

生物计算机科学家,科学家开发细胞计算机 人体就是一台大型计算机

原标题&#xff1a;科学家开发细胞计算机 人体就是一台大型计算机欢迎收看新一期“新奇榜”&#xff0c;新鲜科技、奇闻怪事尽在新奇榜。近日&#xff0c;瑞士研究人员成功制造出了一种功能强大、类似计算机的人体细胞。这种细胞可能被用来帮助监测一个人的健康状况&#xff0c…

休眠中的自然身份证

自然ID是可以唯一标识一个实体的一个或一组属性。 我们最多可以为一个实体定义一个自然ID。 当Hibernate在实体映射文件中看到natural-id标记时&#xff0c;它会自动在构成natural-id的属性上创建唯一且非空的约束。 首先&#xff0c;让我们看一下简单和复合自然ID的示例。 简…

k8s源码分析 pdf_rook源码分析之一:rook架构解析

rook简介Rook是一款云原生环境下的开源分布式存储编排系统&#xff0c;目前支持 Ceph、NFS、Edegefs、Cassandra、CockroachDB等存储系统。它实现了一个自动管理的、自动扩容的、自动修复的分布式存储服务。Rook 支持自动部署、启动、配置、分配、扩容/缩容、升级、迁移、灾难恢…

24 python异常机制

1 --------------------捕获多个异常-------------------------------------------2 try:3 pass4 except Exception1 as e:5 raise 6 except Exception2 as e:7 raise 8 except Exception3 as e:9 raise 10 。。。。等等 11 12 ##--- 其实等同于以下&#xf…

.net压缩文件夹

1&#xff0c;引用&#xff1a;using System.IO.Packaging; 2&#xff0c;压缩文件的方法&#xff1a; /// <summary>/// 压缩文件夹到制定的路径/// </summary>/// <param name"folderName">要压缩的文件物理路径</param>/// <param nam…

weex eros框架源码解析

weex eros是基于alibaba weex框架进行二次封装的客户端跨平台开发框架&#xff0c;主要是为前端开发者&#xff08;可以不用熟悉客户端开发)提供的一站式客户端app开发解决方案。官网地址为&#xff1a;https://bmfe.github.io/eros-docs/#/。为了方便前端开发者和客户端开发者…