ShallowEtagHeaderFilter是Spring提供的支持ETag的一个servlet Filter。他是一个纯粹的Filter,所以可以很容易与web框架集成。
ShallowEtagHeaderFilter将创建一些很弱的(shallow)Etag()
The
ShallowEtagHeaderFilter filter creates so-called shallow ETags (和 deep ETags相对立)。这个Filter会将JSP等的内容缓存,生成MD5的key,然后在response中作为Etage的header返回给客户端。下次客户端对相同的资源(或者说相同的url)发出请求时,客户端会将之前生成的key作为If-None-Match的值发送到server端。 Filter会客户端传来的值和服务器上的做比较,如果相同,则返回304(关于304, 请见对Http304的理解);否则,将发送新的内容到客户端。
使用方法如下:
首先将这个filter引入到系统中,和其他的,如loginFilter类似,只要在配置文件(通常为web.xml)中加入如下代码即可:
<filter> <filter-name>etagFilter</filter-name> <filter-class>org.springframework.web.filter.ShallowEtagHeaderFilter</filter-class> </filter> <filter-mapping> <filter-name>etagFilter</filter-name> <servlet-name>petclinic</servlet-name> </filter-mapping>
Java实现的代码如下(此段代码为Filter的实现,仅供参考,不用加到系统中)
ShallowEtagResponseWrapper responseWrapper = new ShallowEtagResponseWrapper(response); filterChain.doFilter(request, responseWrapper); byte[] body = responseWrapper.toByteArray(); String responseETag = generateETagHeaderValue(body); response.setHeader(HEADER_ETAG, responseETag); String requestETag = request.getHeader(HEADER_IF_NONE_MATCH); if (responseETag.equals(requestETag)) { if (logger.isTraceEnabled()) { logger.trace("ETag [" + responseETag + "] equal to If-None-Match, sending 304"); } response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } else { if (logger.isTraceEnabled()) { logger.trace("ETag [" + responseETag + "] not equal to If-None-Match [" + requestETag + "], sending normal response"); } response.setContentLength(body.length); FileCopyUtils.copy(body, response.getOutputStream()); }
官方文档:
http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/filter/ShallowEtagHeaderFilter.html