Created
February 21, 2013 15:06
-
-
Save superbob/5005291 to your computer and use it in GitHub Desktop.
Servlet filter inhibitor, usefull when you want to bypass an undesired filter sometimes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
*/ | |
package com.github.superbob.demo.servlets.filter; | |
import java.io.IOException; | |
import javax.servlet.Filter; | |
import javax.servlet.FilterChain; | |
import javax.servlet.FilterConfig; | |
import javax.servlet.ServletException; | |
import javax.servlet.ServletRequest; | |
import javax.servlet.ServletResponse; | |
import javax.servlet.http.HttpServletRequest; | |
import org.slf4j.Logger; | |
import org.slf4j.LoggerFactory; | |
/** | |
* @author superbob | |
* | |
*/ | |
public class FilterInhibitor implements Filter { | |
private static final Logger logger = LoggerFactory.getLogger(FilterInhibitor.class); | |
private static final String FILTER_PARAM_CLASS = "inhibitor.filterClass"; | |
private static final String FILTER_PARAM_HEADER = "inhibitor.header"; | |
private static final String HEADER_DEFAULT = "Inhibit"; | |
private String header = HEADER_DEFAULT; | |
private Filter filter; | |
/* (non-Javadoc) | |
* @see javax.servlet.Filter#destroy() | |
*/ | |
@Override | |
public void destroy() { | |
logger.info("Destroying filter inhibitor"); | |
logger.info("Destroying real filter"); | |
filter.destroy(); | |
logger.info("Destroyed !"); | |
} | |
/* (non-Javadoc) | |
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) | |
*/ | |
@Override | |
public void doFilter(ServletRequest arg0, ServletResponse arg1, | |
FilterChain arg2) throws IOException, ServletException { | |
if (allow(arg0, arg1, arg2)) { | |
filter.doFilter(arg0, arg1, arg2); | |
} else { | |
arg2.doFilter(arg0, arg1); | |
} | |
} | |
/* (non-Javadoc) | |
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig) | |
*/ | |
@Override | |
public void init(FilterConfig arg0) throws ServletException { | |
logger.info("Initializing filter inhibitor"); | |
try { | |
logger.info("Loading real filter : " + arg0.getInitParameter(FILTER_PARAM_CLASS)); | |
this.filter = (Filter) Class.forName(arg0.getInitParameter(FILTER_PARAM_CLASS)).newInstance(); | |
} catch (InstantiationException e) { | |
logger.error("exception while initializing inhibitor filter", e); | |
throw new RuntimeException(e); | |
} catch (IllegalAccessException e) { | |
logger.error("exception while initializing inhibitor filter", e); | |
throw new RuntimeException(e); | |
} catch (ClassNotFoundException e) { | |
logger.error("ClassNotFoundException while initializing inhibitor filter, check your inhibitor filter configuration in web.xml and your classpath", e); | |
throw new RuntimeException(e); | |
} | |
final String paramHeader = arg0.getInitParameter(FILTER_PARAM_HEADER); | |
if (paramHeader != null) { | |
this.header = paramHeader; | |
} | |
logger.info("Filtering on header : " + this.header); | |
logger.info("Initializing real filter"); | |
filter.init(arg0); | |
logger.info("Inhibitor engaged !"); | |
} | |
private final boolean allow(ServletRequest arg0, ServletResponse arg1, | |
FilterChain arg2) { | |
if (HttpServletRequest.class.isAssignableFrom(arg0.getClass())) { | |
HttpServletRequest httpReq = (HttpServletRequest) arg0; | |
return !Boolean.parseBoolean(httpReq.getHeader(header)); | |
} | |
return true; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- Struts 2 --> | |
<!-- Struts 2 messes with file uploaded when using spring, | |
so an inhibitor is used to bypass its filtering when a given header is found in the request --> | |
<filter> | |
<filter-name>struts2</filter-name> | |
<filter-class>com.github.superbob.demo.servlets.filter.FilterInhibitor</filter-class> | |
<!-- This is the real filter (struts2) --> | |
<init-param> | |
<param-name>inhibitor.filterClass</param-name> | |
<param-value>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</param-value> | |
</init-param> | |
<!-- This is the header to look for, when it is set to true, the bypass will occur, | |
otherwise the filter (struts2) will be called transparently --> | |
<init-param> | |
<param-name>inhibitor.header</param-name> | |
<param-value>Inhibit</param-value> | |
</init-param> | |
<!-- All the specified parameters are transfered to the filter (struts2) initialization --> | |
<init-param> | |
<param-name>actionPackages</param-name> | |
<param-value>com.github.superbob.demo.struts.actions</param-value> | |
</init-param> | |
</filter> | |
<filter-mapping> | |
<filter-name>struts2</filter-name> | |
<url-pattern>*.action</url-pattern> | |
<dispatcher>FORWARD</dispatcher> | |
<dispatcher>REQUEST</dispatcher> | |
</filter-mapping> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I think this is an ingenious solution. With your permission, I tried to improve a bit to make it more reusable.
I also publish my code in github (https://github.com/evazquezma/JEE6/tree/master/wrapperFilter) and http://trabajosdesisifo.blogspot.com.es/2015/01/java-servlet-byapssfilter-filter.html.
Regards