このアプローチは、特定のフィルターとそれ以降のすべてのフィルターを防止する場合に機能します。たとえば、あなたはうまくいくはずです。(GuiceFilterのようなフィルターを介して)アプリケーションロジックを許可する代わりに、サーブレットコンテナー内の静的リソースとしてコンテンツを提供したい場合:
静的リソースファイルを含むフォルダーをデフォルトのサーブレットにマッピングします。サーブレットフィルターを作成し、web.xmlのGuiceFilterの前に配置します。作成したフィルターでは、GuiceFilterに転送するリクエストと、ディスパッチャーに直接転送するリクエストを分離できます。例を次に示します...
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");
}
}
残念ながら、後続のステップを維持しながらフィルターチェーンの1つのステップだけをスキップしたい場合、これは機能しません。