Cette approche fonctionne lorsque vous voulez empêcher un certain filtre et tous les suivants. Elle devrait bien fonctionner si vous voulez, par exemple, servir du contenu en tant que ressources statiques dans votre conteneur de servlets au lieu de laisser votre logique d'application (à travers un filtre comme GuiceFilter) :
Mettez en correspondance le dossier contenant vos fichiers de ressources statiques avec le servlet par défaut. Créez un filtre de servlet et mettez-le avant le GuiceFilter dans votre web.xml. Dans le filtre que vous avez créé, vous pouvez séparer le transfert de certaines requêtes vers le GuiceFilter et d'autres directement vers le dispatcher. Voici un exemple...
web.xml
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>StaticResourceFilter</filter-name>
<filter-class>com.project.filter.StaticResourceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>StaticResourceFilter</filter-name>
<url-pattern>/static/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
StaticResourceFilter.class
public class StaticResourceFilter implements Filter {
private final static Logger LOGGER = LoggerFactory.getLogger(StaticResourceFilter.class);
private static final String RESOURCE_PATH = "/static/";
@Override
public void init(final FilterConfig filterConfig) throws ServletException {
LOGGER.info("StaticResourceFilter initialized");
}
@Override
public void doFilter(final ServletRequest request, final ServletResponse response,
final FilterChain chain) throws IOException, ServletException {
String path = ((HttpServletRequest) request).getServletPath();
if (path.toLowerCase().startsWith(RESOURCE_PATH)) {
request.getRequestDispatcher(path).forward(request, response);
} else {
chain.doFilter(request, response);
}
}
@Override
public void destroy() {
LOGGER.info("StaticResourceFilter destroyed");
}
}
Malheureusement, si vous souhaitez simplement sauter une étape de la chaîne de filtrage tout en conservant celles qui suivent, cela ne fonctionnera pas.