Package org.springframework.web.filter
Class ShallowEtagHeaderFilter
- java.lang.Object
- org.springframework.web.filter.GenericFilterBean
- org.springframework.web.filter.OncePerRequestFilter
- org.springframework.web.filter.ShallowEtagHeaderFilter
- All Implemented Interfaces:
Filter
,Aware
,BeanNameAware
,DisposableBean
,InitializingBean
,EnvironmentAware
,EnvironmentCapable
,ServletContextAware
public class ShallowEtagHeaderFilter extends OncePerRequestFilter
Filter
that generates anETag
value based on the content on the response. This ETag is compared to theIf-None-Match
header of the request. If these headers are equal, the response content is not sent, but rather a304 "Not Modified"
status instead.Since the ETag is based on the response content, the response (e.g. a
View
) is still rendered. As such, this filter only saves bandwidth, not server performance.- Since:
- 3.0
- Author:
- Arjen Poutsma, Rossen Stoyanchev, Brian Clozel, Juergen Hoeller
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
Constructors Constructor Description ShallowEtagHeaderFilter()
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static void
disableContentCaching(ServletRequest request)
This method can be used to disable the content caching response wrapper of the ShallowEtagHeaderFilter.protected void
doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
Same contract as fordoFilter
, but guaranteed to be just invoked once per request within a single request thread.protected String
generateETagHeaderValue(InputStream inputStream, boolean isWeak)
Generate the ETag header value from the given response body byte array.protected boolean
isEligibleForEtag(HttpServletRequest request, HttpServletResponse response, int responseStatusCode, InputStream inputStream)
Indicates whether the given request and response are eligible for ETag generation.boolean
isWriteWeakETag()
Return whether the ETag value written to the response should be weak, as per RFC 7232.void
setWriteWeakETag(boolean writeWeakETag)
Set whether the ETag value written to the response should be weak, as per RFC 7232.protected boolean
shouldNotFilterAsyncDispatch()
The default value isfalse
so that the filter may delay the generation of an ETag until the last asynchronously dispatched thread.Methods inherited from class org.springframework.web.filter.OncePerRequestFilter
doFilter, getAlreadyFilteredAttributeName, isAsyncDispatch, isAsyncStarted, shouldNotFilter, shouldNotFilterErrorDispatch
Methods inherited from class org.springframework.web.filter.GenericFilterBean
addRequiredProperty, afterPropertiesSet, createEnvironment, destroy, getEnvironment, getFilterConfig, getFilterName, getServletContext, init, initBeanWrapper, initFilterBean, setBeanName, setEnvironment, setServletContext
Constructor Detail
ShallowEtagHeaderFilter
public ShallowEtagHeaderFilter()
Method Detail
setWriteWeakETag
public void setWriteWeakETag(boolean writeWeakETag)
Set whether the ETag value written to the response should be weak, as per RFC 7232.Should be configured using an
<init-param>
for parameter name "writeWeakETag" in the filter definition inweb.xml
.- Since:
- 4.3
- See Also:
- RFC 7232 section 2.3
isWriteWeakETag
public boolean isWriteWeakETag()
Return whether the ETag value written to the response should be weak, as per RFC 7232.- Since:
- 4.3
shouldNotFilterAsyncDispatch
protected boolean shouldNotFilterAsyncDispatch()
The default value isfalse
so that the filter may delay the generation of an ETag until the last asynchronously dispatched thread.- Overrides:
shouldNotFilterAsyncDispatch
in classOncePerRequestFilter
doFilterInternal
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException
Description copied from class:OncePerRequestFilter
Same contract as fordoFilter
, but guaranteed to be just invoked once per request within a single request thread. SeeOncePerRequestFilter.shouldNotFilterAsyncDispatch()
for details.Provides HttpServletRequest and HttpServletResponse arguments instead of the default ServletRequest and ServletResponse ones.
- Specified by:
doFilterInternal
in classOncePerRequestFilter
- Throws:
ServletException
IOException
isEligibleForEtag
protected boolean isEligibleForEtag(HttpServletRequest request, HttpServletResponse response, int responseStatusCode, InputStream inputStream)
Indicates whether the given request and response are eligible for ETag generation.The default implementation returns
true
if all conditions match:- response status codes in the
2xx
series - request method is a GET
- response Cache-Control header is not set or does not contain a "no-store" directive
- Parameters:
request
- the HTTP requestresponse
- the HTTP responseresponseStatusCode
- the HTTP response status codeinputStream
- the response body- Returns:
true
if eligible for ETag generation,false
otherwise
- response status codes in the
generateETagHeaderValue
protected String generateETagHeaderValue(InputStream inputStream, boolean isWeak) throws IOException
Generate the ETag header value from the given response body byte array.The default implementation generates an MD5 hash.
- Parameters:
inputStream
- the response body as an InputStreamisWeak
- whether the generated ETag should be weak- Returns:
- the ETag header value
- Throws:
IOException
- See Also:
DigestUtils
disableContentCaching
public static void disableContentCaching(ServletRequest request)
This method can be used to disable the content caching response wrapper of the ShallowEtagHeaderFilter. This can be done before the start of HTTP streaming for example where the response will be written to asynchronously and not in the context of a Servlet container thread.- Since:
- 4.2