public class DelegatingFilterProxy extends GenericFilterBean
web.xml
, specifying the name of the
target bean in the Spring application context.
web.xml
will usually contain a DelegatingFilterProxy
definition,
with the specified filter-name
corresponding to a bean name in
Spring's root application context. All calls to the filter proxy will then
be delegated to that bean in the Spring context, which is required to implement
the standard Servlet 2.3 Filter interface.
This approach is particularly useful for Filter implementation with complex setup needs, allowing to apply the full Spring bean definition machinery to Filter instances. Alternatively, consider standard Filter setup in combination with looking up service beans from the Spring root application context.
NOTE: The lifecycle methods defined by the Servlet Filter interface
will by default not be delegated to the target bean, relying on the
Spring application context to manage the lifecycle of that bean. Specifying
the "targetFilterLifecycle" filter init-param as "true" will enforce invocation
of the Filter.init
and Filter.destroy
lifecycle methods
on the target bean, letting the servlet container manage the filter lifecycle.
As of Spring 3.1, DelegatingFilterProxy
has been updated to optionally accept
constructor parameters when using Servlet 3.0's instance-based filter registration
methods, usually in conjunction with Spring 3.1's
WebApplicationInitializer
SPI. These constructors allow
for providing the delegate Filter bean directly, or providing the application context
and bean name to fetch, avoiding the need to look up the application context from the
ServletContext.
This class was originally inspired by Spring Security's FilterToBeanProxy
class, written by Ben Alex.
setTargetBeanName(java.lang.String)
,
setTargetFilterLifecycle(boolean)
,
javax.servlet.Filter#doFilter
,
javax.servlet.Filter#init
,
javax.servlet.Filter#destroy
,
DelegatingFilterProxy(Filter)
,
#DelegatingFilterProxy(String)
,
DelegatingFilterProxy(String, WebApplicationContext)
,
javax.servlet.ServletContext#addFilter(String, Filter)
,
WebApplicationInitializer
Modifier and Type | Field and Description |
---|---|
private java.lang.String |
contextAttribute |
private Filter |
delegate |
private java.lang.Object |
delegateMonitor |
private java.lang.String |
targetBeanName |
private boolean |
targetFilterLifecycle |
private WebApplicationContext |
webApplicationContext |
logger
Constructor and Description |
---|
DelegatingFilterProxy()
Create a new
DelegatingFilterProxy . |
DelegatingFilterProxy(Filter delegate)
Create a new
DelegatingFilterProxy with the given Filter delegate. |
DelegatingFilterProxy(java.lang.String targetBeanName,
WebApplicationContext wac)
Create a new
DelegatingFilterProxy that will retrieve the named target
bean from the given Spring WebApplicationContext . |
Modifier and Type | Method and Description |
---|---|
void |
destroy()
Subclasses may override this to perform custom filter shutdown.
|
protected void |
destroyDelegate(Filter delegate)
Destroy the Filter delegate.
|
void |
doFilter(ServletRequest request,
ServletResponse response,
FilterChain filterChain) |
protected WebApplicationContext |
findWebApplicationContext()
Return the
WebApplicationContext passed in at construction time, if available. |
java.lang.String |
getContextAttribute()
Return the name of the ServletContext attribute which should be used to retrieve the
WebApplicationContext from which to load the delegate Filter bean. |
protected java.lang.String |
getTargetBeanName()
Return the name of the target bean in the Spring application context.
|
protected Filter |
initDelegate(WebApplicationContext wac)
Initialize the Filter delegate, defined as bean the given Spring
application context.
|
protected void |
initFilterBean()
Subclasses may override this to perform custom initialization.
|
protected void |
invokeDelegate(Filter delegate,
ServletRequest request,
ServletResponse response,
FilterChain filterChain)
Actually invoke the delegate Filter with the given request and response.
|
protected boolean |
isTargetFilterLifecycle()
Return whether to invoke the
Filter.init and
Filter.destroy lifecycle methods on the target bean. |
void |
setContextAttribute(java.lang.String contextAttribute)
Set the name of the ServletContext attribute which should be used to retrieve the
WebApplicationContext from which to load the delegate Filter bean. |
void |
setTargetBeanName(java.lang.String targetBeanName)
Set the name of the target bean in the Spring application context.
|
void |
setTargetFilterLifecycle(boolean targetFilterLifecycle)
Set whether to invoke the
Filter.init and
Filter.destroy lifecycle methods on the target bean. |
addRequiredProperty, afterPropertiesSet, getFilterConfig, getFilterName, getServletContext, init, initBeanWrapper, setBeanName, setEnvironment, setServletContext
private java.lang.String contextAttribute
private WebApplicationContext webApplicationContext
private java.lang.String targetBeanName
private boolean targetFilterLifecycle
private volatile Filter delegate
private final java.lang.Object delegateMonitor
public DelegatingFilterProxy()
DelegatingFilterProxy
. For traditional (pre-Servlet 3.0) use
in web.xml
.setTargetBeanName(String)
public DelegatingFilterProxy(Filter delegate)
DelegatingFilterProxy
with the given Filter
delegate.
Bypasses entirely the need for interacting with a Spring application context,
specifying the target bean name, etc.
For use in Servlet 3.0+ environments where instance-based registration of filters is supported.
delegate
- the Filter
instance that this proxy will delegate to and
manage the lifecycle for (must not be null
).doFilter(ServletRequest, ServletResponse, FilterChain)
,
invokeDelegate(Filter, ServletRequest, ServletResponse, FilterChain)
,
destroy()
,
GenericFilterBean.setEnvironment(org.springframework.core.env.Environment)
public DelegatingFilterProxy(java.lang.String targetBeanName, WebApplicationContext wac)
DelegatingFilterProxy
that will retrieve the named target
bean from the given Spring WebApplicationContext
.
For use in Servlet 3.0+ environments where instance-based registration of filters is supported.
The target bean must implement the standard Servlet Filter interface.
The given WebApplicationContext
may or may not be refreshed when passed
in. If it has not, and if the context implements ConfigurableApplicationContext
,
a refresh()
will be attempted before
retrieving the named target bean.
This proxy's Environment
will be inherited from the given
WebApplicationContext
.
targetBeanName
- name of the target filter bean in the Spring application
context (must not be null
).wac
- the application context from which the target filter will be retrieved;
if null
, an application context will be looked up from ServletContext
as a fallback.findWebApplicationContext()
,
GenericFilterBean.setEnvironment(org.springframework.core.env.Environment)
public void setContextAttribute(java.lang.String contextAttribute)
WebApplicationContext
from which to load the delegate Filter
bean.public java.lang.String getContextAttribute()
WebApplicationContext
from which to load the delegate Filter
bean.public void setTargetBeanName(java.lang.String targetBeanName)
By default, the filter-name
as specified for the
DelegatingFilterProxy in web.xml
will be used.
protected java.lang.String getTargetBeanName()
public void setTargetFilterLifecycle(boolean targetFilterLifecycle)
Filter.init
and
Filter.destroy
lifecycle methods on the target bean.
Default is "false"; target beans usually rely on the Spring application context for managing their lifecycle. Setting this flag to "true" means that the servlet container will control the lifecycle of the target Filter, with this proxy delegating the corresponding calls.
protected boolean isTargetFilterLifecycle()
Filter.init
and
Filter.destroy
lifecycle methods on the target bean.protected void initFilterBean() throws ServletException
GenericFilterBean
Note: This method will be called from standard filter initialization as well as filter bean initialization in a Spring application context. Filter name and ServletContext will be available in both cases.
This default implementation is empty.
initFilterBean
in class GenericFilterBean
ServletException
- if subclass initialization failsGenericFilterBean.getFilterName()
,
GenericFilterBean.getServletContext()
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, java.io.IOException
ServletException
java.io.IOException
public void destroy()
GenericFilterBean
Note: This method will be called from standard filter destruction as well as filter bean destruction in a Spring application context.
This default implementation is empty.
destroy
in interface DisposableBean
destroy
in class GenericFilterBean
protected WebApplicationContext findWebApplicationContext()
WebApplicationContext
passed in at construction time, if available.
Otherwise, attempt to retrieve a WebApplicationContext
from the
ServletContext
attribute with the configured name if set. Otherwise look up a WebApplicationContext
under
the well-known "root" application context attribute. The
WebApplicationContext
must have already been loaded and stored in the
ServletContext
before this filter gets initialized (or invoked).
Subclasses may override this method to provide a different
WebApplicationContext
retrieval strategy.
WebApplicationContext
for this proxy, or null
if not foundDelegatingFilterProxy(String, WebApplicationContext)
,
getContextAttribute()
,
WebApplicationContextUtils#getWebApplicationContext(javax.servlet.ServletContext)
,
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
protected Filter initDelegate(WebApplicationContext wac) throws ServletException
The default implementation fetches the bean from the application context
and calls the standard Filter.init
method on it, passing
in the FilterConfig of this Filter proxy.
wac
- the root application contextServletException
- if thrown by the FiltergetTargetBeanName()
,
isTargetFilterLifecycle()
,
GenericFilterBean.getFilterConfig()
,
javax.servlet.Filter#init(javax.servlet.FilterConfig)
protected void invokeDelegate(Filter delegate, ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, java.io.IOException
delegate
- the delegate Filterrequest
- the current HTTP requestresponse
- the current HTTP responsefilterChain
- the current FilterChainServletException
- if thrown by the Filterjava.io.IOException
- if thrown by the Filterprotected void destroyDelegate(Filter delegate)
Filter.destroy
on it.delegate
- the Filter delegate (never null
)isTargetFilterLifecycle()
,
javax.servlet.Filter#destroy()