浏览 5384 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-05
最后修改:2009-11-05
Support for ETags is provided by the servlet filter ShallowEtagHeaderFilter. It is a plain Servlet Filter, and thus can be used in combination with any web framework. The ShallowEtagHeaderFilter filter creates so-called shallow ETags (as opposed to deep ETags, more about that later).The filter caches the content of the rendered JSP (or other content), generates an MD5 hash over that, and returns that as an ETag header in the response. The next time a client sends a request for the same resource, it uses that hash as the If-None-Match value. The filter detects this, renders the view again, and compares the two hashes. If they are equal, a 304 is returned. This filter will not save processing power, as the view is still rendered. The only thing it saves is bandwidth, as the rendered response is not sent back over the wire. <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> 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()); } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-11-05
是个能提高性能的好东东
|
|
返回顶楼 | |
发表时间:2009-11-06
SSailYang 写道 是个能提高性能的好东东
不是的,官方的解释是,this filter only saves bandwidth, not server performance. 意思是这个过滤器只能节省带快,而不是服务器性能。 http://static.springsource.org/spring/docs/3.0.0.M2/javadoc-api/org/springframework/web/filter/ShallowEtagHeaderFilter.html |
|
返回顶楼 | |
发表时间:2009-11-06
看看这个基于资源的HTTP Cache的实现介绍,基本同理,而且还解决了一些问题
|
|
返回顶楼 | |
发表时间:2009-11-06
这是原话
As such, this filter only saves bandwidth, not server performance |
|
返回顶楼 | |
发表时间:2009-11-06
如果要提高性能,需要服务器端的程序做一些额外处理
比如生成etag,可以根据主要数据的最后修改时间来生成 每次先先只取出最后修改时间进行比较,匹配返回304,否则再取数据 |
|
返回顶楼 | |
发表时间:2010-01-20
要想发挥etag的作用需要自己动手实现
etag的值相当于对http response的md5(计算量相当大啊) 发送etag到浏览器后 下次请求同一个url是会带回到服务器 服务可用新生成的etag与旧etag做比较 如果相同返回304 否则返回新页面 |
|
返回顶楼 | |