org.springframework.web.filter
Class ShallowEtagHeaderFilter

java.lang.Object
  extended by org.springframework.web.filter.GenericFilterBean
      extended by org.springframework.web.filter.OncePerRequestFilter
          extended by org.springframework.web.filter.ShallowEtagHeaderFilter
All Implemented Interfaces:
Filter, Aware, BeanNameAware, DisposableBean, InitializingBean, EnvironmentAware, ServletContextAware

public class ShallowEtagHeaderFilter
extends OncePerRequestFilter

Filter that generates an ETag value based on the content on the response. This ETag is compared to the If-None-Match header of the request. If these headers are equal, the response content is not sent, but rather a 304 "Not Modified" status instead.

Since the ETag is based on the response content, the response (or View) is still rendered. As such, this filter only saves bandwidth, not server performance.

Since:
3.0
Author:
Arjen Poutsma

Field Summary
 
Fields inherited from class org.springframework.web.filter.OncePerRequestFilter
ALREADY_FILTERED_SUFFIX
 
Fields inherited from class org.springframework.web.filter.GenericFilterBean
logger
 
Constructor Summary
ShallowEtagHeaderFilter()
           
 
Method Summary
protected  void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
          Same contract as for doFilter, but guaranteed to be just invoked once per request.
protected  String generateETagHeaderValue(byte[] bytes)
          Generate the ETag header value from the given response body byte array.
protected  boolean isEligibleForEtag(HttpServletRequest request, HttpServletResponse response, int responseStatusCode, byte[] responseBody)
          Indicates whether the given request and response are eligible for ETag generation.
 
Methods inherited from class org.springframework.web.filter.OncePerRequestFilter
doFilter, getAlreadyFilteredAttributeName, shouldNotFilter
 
Methods inherited from class org.springframework.web.filter.GenericFilterBean
addRequiredProperty, afterPropertiesSet, destroy, getFilterConfig, getFilterName, getServletContext, init, initBeanWrapper, initFilterBean, setBeanName, setEnvironment, setServletContext
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ShallowEtagHeaderFilter

public ShallowEtagHeaderFilter()
Method Detail

doFilterInternal

protected void doFilterInternal(HttpServletRequest request,
                                HttpServletResponse response,
                                FilterChain filterChain)
                         throws ServletException,
                                IOException
Description copied from class: OncePerRequestFilter
Same contract as for doFilter, but guaranteed to be just invoked once per request. Provides HttpServletRequest and HttpServletResponse arguments instead of the default ServletRequest and ServletResponse ones.

Specified by:
doFilterInternal in class OncePerRequestFilter
Throws:
ServletException
IOException

isEligibleForEtag

protected boolean isEligibleForEtag(HttpServletRequest request,
                                    HttpServletResponse response,
                                    int responseStatusCode,
                                    byte[] responseBody)
Indicates whether the given request and response are eligible for ETag generation.

The default implementation returns true for response status codes in the 2xx series.

Parameters:
request - the HTTP request
response - the HTTP response
responseStatusCode - the HTTP response status code
responseBody - the response body
Returns:
true if eligible for ETag generation; false otherwise

generateETagHeaderValue

protected String generateETagHeaderValue(byte[] bytes)
Generate the ETag header value from the given response body byte array.

The default implementation generates an MD5 hash.

Parameters:
bytes - the response body as byte array
Returns:
the ETag header value
See Also:
DigestUtils