Cách tiếp cận này hoạt động khi bạn muốn ngăn chặn một bộ lọc nhất định và tất cả các bộ lọc sau. Nó sẽ hoạt động tốt nếu bạn ví dụ. muốn phân phát một số nội dung dưới dạng tài nguyên tĩnh trong vùng chứa servlet của bạn thay vì để logic ứng dụng của bạn (thông qua bộ lọc như GuiceFilter):
Ánh xạ thư mục với các tệp tài nguyên tĩnh của bạn vào servlet mặc định. Tạo bộ lọc servlet và đặt nó trước GuiceFilter trong tệp web của bạn. Trong bộ lọc đã tạo của bạn, bạn có thể tách biệt giữa việc chuyển tiếp một số yêu cầu tới GuiceFilter và các yêu cầu khác trực tiếp đến bộ điều phối. Ví dụ sau ...
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");
}
}
Thật không may nếu bạn chỉ muốn bỏ qua một bước duy nhất trong chuỗi bộ lọc trong khi vẫn giữ những bước tiếp theo, điều này sẽ không hoạt động.