下面我们触发一些变化,并观察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喜欢航行、钓鱼、吉他和一饮而尽高质量的红葡萄酒(不一定要按这个顺序来)。
分享到:
相关推荐
本文将详细介绍ETags的概念、作用机制以及如何将其集成到基于Spring和Hibernate的动态Web应用中。 #### 什么是ETags? ETag(实体标签)是由HTTP协议定义的一种标识符,用于唯一标识某个Web资源(如网页、图片等)...
9. Spring中的REST分页:这部分讲解了如何在Spring中实现REST API的分页功能,使得客户端可以更方便地处理大量的数据集。 10. 使用Spring处理REST错误:本节介绍了如何在Spring REST API中处理错误情况,包括错误的...
1. **ETags在Spring中的应用** ETags是一种HTTP头,用于标识某个资源的特定版本。Spring框架提供了内置的支持来处理ETags,这样可以在客户端缓存资源的同时,减少不必要的网络传输。 2. **REST API版本控制** ...
总结来说,通过Spring Data REST,Java开发者可以轻松地在应用程序中集成ETag和Last-Modified机制,实现高效的乐观并发控制和条件GET请求,提高系统性能,保证数据一致性。这种做法不仅适用于单体应用,也是微服务...
- **Spring MVC**:Spring MVC框架用于构建Web应用程序,支持RESTful Web服务的开发。 - **Spring Boot**:简化了Spring应用的初始搭建以及开发过程,提供了一系列的默认配置,便于快速开发。 #### 架构与数据模型 ...
- **Spring Boot**:一个简化Spring应用开发的框架,通过提供默认配置、自动化配置等功能,使得开发者能够快速构建独立的、生产级别的基于Spring的应用程序。 - **Spring Tool Suite**:使用该工具可以快速生成...
在构建基于Spring的应用程序时,首先需要创建一个基本的Web应用结构。这一步骤通常涉及使用Spring框架的核心功能来搭建应用的基本框架。 - **项目初始化**:通过Maven或Gradle等构建工具创建项目。 - **依赖管理**:...
在本项目中,我们主要探讨的是如何在Spring Boot应用程序中集成MinIO服务,实现文件的分片上传功能。MinIO是一款高性能、轻量级的对象存储服务,它支持Amazon S3 API,非常适合用作云存储解决方案。Spring Boot是...
- **Spring框架**:Spring框架是一种广泛使用的Java平台,用于构建企业级应用程序。它提供了一整套解决方案来简化开发流程,包括但不限于依赖注入、面向切面编程(AOP)以及数据访问抽象化等。 - **Spring与REST结合...
在Vim中,可以使用`tagbar` 或 `CtrlP` 插件来查看和导航标签。 **更新索引** 当项目代码发生变化时,你需要更新索引。可以运行: ```bash lein codeindex update ``` 这会重新生成索引,确保标签是最新的。 **...
Spring框架是一个广泛使用的Java平台,用于构建企业级应用,特别是Web应用。我们的RESTful Web服务将会遵循以下架构设计: - **架构**:我们将采用分层架构,确保各个组件之间职责清晰。 - **数据模型**:定义服务...
ctags-etags-5.8-2.el6.i686.rpm
对于使用windows IIS的服务器,则需要使用第三方的DLL文件更有效些,具体使用方法:下载REMEtags,RemEtag.zip,解压到服务器下的文件夹下,再启用ISAPI,即把RemEtag.dll添加到ISAPI应用下运行,再重启IIS即可生效。...
Apache通常作为前端服务器,负责处理静态内容,而Tomcat作为一个Java应用服务器,主要处理JSP和Servlet等动态内容。首先,我们需要确保硬件配置满足基本需求,例如文中提到的AMD Athlon II X4 640 CPU、320GB硬盘和...
【网站优化资料】这篇文章主要探讨了提升网站性能的策略,主要集中在服务器侧优化和Cookie管理。...在实践中,需要根据网站的特性和用户需求,灵活应用这些方法,不断调整和优化,以达到最佳效果。