jax-rs jax-ws_使用JAX-RS的HTTP缓存

jax-rs jax-ws

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

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

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

相关文章

php常驻对象,php对象

linux中用户的主目录&#xff5e;-在Linux中代表用户主目录 对一般用户,-表示/home/(用户名) 对于root用户,-表示/root 如果要查看-的真实面貌,可以先进入-目录,然后用pwd -P命令查看-的绝对路径 cd ~ ...SQL2005语句实现行转列&comma;列转行在做报表时,经常需要将数据表中…

无穷级数求和7个公式_大家看,用反证法判别级数敛散性(送微积分同学)!...

反证法证明级数发散题目、 判断级数 的收敛性。解&#xff1a; 反设收敛。则收敛。所以收敛&#xff0c; 所以收敛&#xff0c; 它为正项级数&#xff0c;但是通过比较分子分母次数得到因为发散&#xff0c; 所以发散&#xff0c;矛盾。所以原级数发散。注记&#xff1a; 教材中…

用户身份验证最佳做法清单

用户身份验证是每个Web应用程序共享的功能。 我们已经实现了很多次&#xff0c;所以很早以前就应该完善它。 然而&#xff0c;错误无时无刻不在发生。 造成这种情况的部分原因是&#xff0c;可能出问题的清单很长。 您可能会错误地存储密码&#xff0c;可能会具有脆弱的密码重…

matlab二元一次方程求解_高中化学二元混合物的十字交叉法解法

“十字交叉法”是高中化学计算题中巧解二元混合物问题的一种常用的有效方法&#xff0c;正确运用“十字交叉法”&#xff0c;可以帮助同学们方便、迅速地解决计算问题。速解的前提&#xff1a;1、必须清楚“十字交叉法”运用后的比例比系——“看分母”法则。即特性数值的分母所…

Loadruner压数据库oracle,LoadRunner连接Oracle数据库(转)

51Testing软件测试网0U#~*o\*l这个是在51上转载的。。e $b#v.m051Testing软件测试网"HyG#r%f;sv7[8yr-S$_zOt }Hs0多谢楼主的奉献。。。D_2c#Sb~p.y9\08\WHR\I0#include51Testing软件测试网H(zk/dI1QawtBstatic LRD_INIT_INFO InitInfo{LRD_INIT_INFO_EYECAT};51Testing软…

python怎么输入两行_python交互模式下输入换行/输入多行命令的方法

先给大家介绍下python交互模式下输入换行/输入多行命令的方法 换行方法 \ 如&#xff1a; >>> print aaa; \ ... print bbb; \ ... print ccc 注意;号的使用。 python本身语句结束和间隔都是不需要&#xff1b;号的&#xff0c;但是在换行时要使用&#xff1b;号&…

linux系统读取excel文件是否存在,小弟我用poi读excel,在window下没有有关问题,但把程序放到linux上时,读取客户端的excel文件报错,不...

我用poi读excel&#xff0c;在window下没有问题&#xff0c;但把程序放到linux上时&#xff0c;读取客户端的excel文件报错&#xff0c;不知道如何解决我用poi读excel&#xff0c;在window下没有问题&#xff0c;但把程序放到linux上时&#xff0c;读取客户端的excel文件报错&a…

利用python计算圆球的体积_python计算圆周长、面积、球体体积并画出圆

#https://github.com/RobberPhex/GTK-Example-CalcArea from gi.repository import Gtk, Gdk, GdkPixbuf from PIL import Image, ImageDraw from io import BytesIO from math import pi class Model:模型类 存储半径&#xff0c;计算周长、面积、体积def __init__(self): sel…

可重入锁 不可重入锁_什么是可重入锁?

可重入锁 不可重入锁在Java 5.0中&#xff0c;增加了一个新功能以增强内部锁定功能&#xff0c;称为可重入锁定。 在此之前&#xff0c;“同步”和“易失性”是实现并发的手段。 public synchronized void doAtomicTransfer(){//enter synchronized block , acquire lock over…

pythonista3安卓_Pythonista 3 app下载

Pythonista 3介绍 Pythonista is a complete scripting environment for Python, running directly on your iPadiPhone. It includes support for both Python 3.62.7, so you can use all the language improvements in Python 3, while still having 2.7 avAIlable for back…

linux查看本机所有预设的系统变量,如何设置与查看Linux系统中的环境变量?

大家都知道&#xff0c;在 Linux 系统中&#xff0c;有环境变量和 Shell 变量这两种变量。环境变量是在程序及其子程序中全局可用的&#xff0c;常常用来储存像默认的文本编辑器或者浏览器&#xff0c;以及可执行文件的路径等等这样的信息。而 Shell 变量仅在当前 Shell 中可用…

使用Amazon s3托管您的Maven工件

如果您使用Amazon Web Services并将Java用于项目&#xff0c;则Amazon S3是托管团队工件的理想场所。 它很容易设置&#xff0c;而且很便宜。 如果您对它们的功能不特别感兴趣&#xff0c;那么它比设置现有存储库选项&#xff08;jfrog&#xff0c;nexus&#xff0c;archiva等…

linux kill进程后黑屏,Linux中Kill进程的N种方法

常规篇&#xff1a;首先&#xff0c;用ps查看进程&#xff0c;方法如下&#xff1a;$ ps -ef……smx 1822 1 0 11:38 ? 00:00:49 gnome-terminalsmx 1823 1822 0 11:38 ? 00:00:00 gnome-pty-helpersmx 1824 1822 0 11:38 pts/0 …

ffmpeg宏块(Macroblock)概念

参考文章&#xff1a;音视频高手课系列5-h264编码基础(宏块原理) 文章目录 使用videoEye分析视频宏块示例FFmpeg宏块概念1. 宏块的定义2. 宏块的分类I-MacroblocksP-MacroblocksB-Macroblocks 3. 宏块的编码过程1. 运动估计2. 变换与量化3. 熵编码 4. 宏块的解码过程1. 熵解码2…

python123循环结构_来学Python啦,大话循环结构~

点击上方蓝字关注"程序员Bob"每日一句&#xff0c;送给最珍贵的你&#xff1a; 为学日益&#xff0c;为道日损&#xff0c;损之又损&#xff0c;以至于无为&#xff0c;无为而无不为。最近想研究爬虫了&#xff0c;准备拾起以前Python&#xff0c;继续学&#xff01;…

linux查看主机脚本,简单的bash脚本查看任意网段的在线主机

一前言最近看到许多同志在写ping某个地址段的bash脚本&#xff0c;我也心血来潮来了一发。 当然本人新手&#xff0c;大神勿喷。二准备工作linux系统的机器一台&#xff0c;当然虚拟机也可以&#xff0c;只要将网卡配置为桥接模式&#xff0c;可以连通其他局域网的主机即可。1…

python求一组数的最大值_python快速求一个数组的最大值/最小值及其索引

enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列&#xff0c;同时列出数据和数据下标。 x [3, 2.2, 7.4, 6, 4] list(enumerate(x)) # 输出 [(0, 3), (1, 2.2), (2, 7.4), (3, 6), (4, 4)] operator.itemgetter()函数用于获取对象的哪些维…

linux远程调用的脚本在ssh时报错,linux:ssh远程调用tomcat脚本时候出错

执行 &dollar;Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...定制Eclipse IDE之插件篇(二)上…

python中什么叫合法的标识_python合法标识符要求是什么

python合法标识符要求是&#xff1a;1、不能以数字开头&#xff1b;2、不能包含非法字符&#xff1b;3、数字不能作为标识符&#xff1b;4、不能包含空格&#xff1b;5、不能包含运算符。1.不能以数字开头>>> 2bin2 File "", line 1 2bin2 ^ SyntaxError: i…

hibernate状态_Hibernate状态的自然身份证

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