下面我们触发一些变化,并观察ETag是否改变。为这个Owner增加了一个Pet:
----------------------------------------------------------
http://localhost:8080/petclinic/addPet.htm?ownerId=10
GET /petclinic/addPet.htm?ownerId=10 HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:8080/petclinic/owner.htm?ownerId=10
Cookie: JSESSIONID=13D2E0CB63897F4EDB56639E46D2BBD8
X-lori-time-1: 1182364356265
HTTP/1.x 200 OK
Server: Apache-Coyote/1.1
Pragma: No-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache, no-store
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-US
Content-Length: 2174
Date: Wed, 20 Jun 2007 18:32:57 GMT
----------------------------------------------------------
http://localhost:8080/petclinic/addPet.htm?ownerId=10
POST /petclinic/addPet.htm?ownerId=10 HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:8080/petclinic/addPet.htm?ownerId=10
Cookie: JSESSIONID=13D2E0CB63897F4EDB56639E46D2BBD8
X-lori-time-1: 1182364402968
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
name=Noddy&birthDate=1000-11-11&typeId=5
HTTP/1.x 302 Moved Temporarily
Server: Apache-Coyote/1.1
Pragma: No-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache, no-store
Location: http://localhost:8080/petclinic/owner.htm?ownerId=10
Content-Language: en-US
Content-Length: 0
Date: Wed, 20 Jun 2007 18:33:23 GMT
因为我们没有为addPet.htm配置ETag,所以不设置相关的响应头。现在,我们再次访问Owener 10,注意相应中的ETag成为了1:
----------------------------------------------------------
http://localhost:8080/petclinic/owner.htm?ownerId=10
GET /petclinic/owner.htm?ownerId=10 HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:8080/petclinic/addPet.htm?ownerId=10
Cookie: JSESSIONID=13D2E0CB63897F4EDB56639E46D2BBD8
X-lori-time-1: 1182364403109
If-Modified-Since: Wed, 20 Jun 2007 18:29:03 GMT
If-None-Match: "-1"
HTTP/1.x 200 OK
Server: Apache-Coyote/1.1
Etag: "1"
Last-Modified: Wed, 20 Jun 2007 18:33:36 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-US
Content-Length: 4317
Date: Wed, 20 Jun 2007 18:33:45 GMT
最后,我们再次请求Owener 10,这次ETag起了作用,我们接受到了一个304未改变信息。
----------------------------------------------------------
http://localhost:8080/petclinic/owner.htm?ownerId=10
GET /petclinic/owner.htm?ownerId=10 HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: JSESSIONID=13D2E0CB63897F4EDB56639E46D2BBD8
X-lori-time-1: 1182364493500
If-Modified-Since: Wed, 20 Jun 2007 18:33:36 GMT
If-None-Match: "1"
HTTP/1.x 304 Not Modified
Server: Apache-Coyote/1.1
Date: Wed, 20 Jun 2007 18:34:55 GMT
如此,我们使用HTTP缓存降低了带宽占用,缩短了处理周期。
The Fine Print: 事实上,采用更细粒度的对象变化跟踪,例如使用对象标识。可以更大程度的提高效率。但是,页面和实体之间的关联很大程度上是由系统中的数据模型设计决定的。上面的实现(ModifiedObjectTracker)是一个说明性的例子,谜底是为更深入的尝试提供思路。上面的实现的目的不是应用于实际的生产环境中(例如不适用于集群环境),一种更远的考虑是使用数据库的触发器跟踪数据变化,让拦截器监测触发器输出结果所在的数据表。
结论
我们已经看到了使用ETag降低贷款占用和缩短处理周期的两种方法。我所希望的是这篇文章为你现在和将来的Web应用项目提供了一种思路,以及对底层的ETag响应头的正确理解和使用。
正如牛顿所说,“如果我看得更远,那是因为我站在巨人的肩膀上”。作为REST的核心,这种风格的应用程序讲的是简单、优雅的软件设计,不重复发明轮子。我相信了解和使用REST风格的架构的核心是主流应用程序开发的一个好的发展,并且我盼望着在以后的开发中能够抬起它的未来。
关于作者
Gavin Terrill是BPS的CTO。从事Java企业级应用开发20年以上。现在依然拒绝发布他的TRS-80。在空闲时间,Gavin喜欢航行、钓鱼、吉他和一饮而尽高质量的红葡萄酒(不一定要按这个顺序来)。
分享到:
相关推荐
本文中,我们将探究一个可被Web开发者利用的、鲜为人知的工具,不引人注意的“ETag响应头(ETag Response Header)”,以及如何将它集成进基于Spring和Hibernate的动态Web应用,以提升应用程序性能和可伸缩性。...
ctags-etags-5.8-2.el6.i686.rpm
lein-codeindex:使用etags,ctags或gtags的索引代码
该项目伴随着 OPI 博客上的一篇文章: :
官方离线安装包,亲测可用
离线安装包,亲测可用
使用正则表达式和过滤器进行两步式标签匹配 强制更新当前标签文件 打开最近的标签 Ctags设置 使用排除模式进行搜索 Grep程序 自定义grep关键字 视窗 〜/ .ctags.exuberant 使用Ctags生成菜单项 逐步指南 步骤1,...
官方离线安装包,亲测可用
将 Rails 应用程序生成的强电子标签转换为弱电子标签,可以通过启用 gzip 压缩的网络服务器传递。 基于这个堆栈溢出问题: : 安装 将此行添加到应用程序的 Gemfile 中: gem 'rails_weak_etags' 然后执行: $ ...
对于使用windows IIS的服务器,则需要使用第三方的DLL文件更有效些,具体使用方法:下载REMEtags,RemEtag.zip,解压到服务器下的文件夹下,再启用ISAPI,即把RemEtag.dll添加到ISAPI应用下运行,再重启IIS即可生效。...
st, 用于服务 static 文件的node 模块 etags caching等 st用于服务 static 文件的MODULE 。 etags 。caching等。用法下面是一些非常简单的用法...只要在http服务器url的root 中服务cwd中的文件:var st = require('st')
当您使用文件处理程序或reply.file()方法时,hapi会自动为您的响应生成ETag头。 但是,如果您使用任何其他类型的响应(例如JSON,HTML,文本等),则不会免费获得ETag。 这个插件可以解决这个问题! ##...
Nginx Static Etags 是一个 Nginx 扩展模块,实现为静态文件生成 ETag 的功能。不过 Nginx 从 1.3.3 版本开始就可通过 etag on | off; 指令来实现同样功能,详情请看这里。使用方法:mkdir ~/src cd ~/src git...
SCTags是Scala语言的ctags和etags提取器。 如果强制使用Scala以外的语言,它将退回到ctags 用法 sctags [-f|-o file] [-R|--recurse] [--list-languages] [--version] -f file | -o file sets the file the tags ...
Gitv适用于使用vim(或gvim)和etags的用户。 gitv的主要功能是它的文件选择器:它使用vim在git存储库中打开任何源文件,如下所示: $ gitv vi keyword当有多个包含关键字的文件时,可以交互选择其中之一。 关键字...
官方离线安装包,亲测可用
etags-中间件 一个 HttpKernelInterface 中间件,用于根据响应内容添加 ETag 标头。 这个包应该与 StackPHP HttpKernelInterface 框架一起工作。 安装 通过作曲家 { " require " : { " aranw/etags-middleware " :...
有关文档,请参见《 冥王星-行星供稿阅读器和(静态)网站生成器-根据已发布的网络...有关使用 feed阅读器机制的Web应用程序,请参见 。 Web应用程序包括:pluto.admin,pluto.live.starter,pluto.live等。 执照 pl
只需在http服务器url根目录下的cwd中提供文件即可: const st = require ( 'st' )const http = require ( 'http' )http . createServer ( st ( process . cwd ( ) )) . listen ( 1337 ) 在/ static网址下以静态方式...