วิธีนี้ใช้ได้ผลเมื่อคุณต้องการป้องกันตัวกรองบางตัวและตัวกรองทั้งหมดต่อไปนี้ ควรทำงานได้ดีถ้าคุณเช่น ต้องการให้บริการเนื้อหาบางส่วนเป็นทรัพยากรแบบคงที่ภายในคอนเทนเนอร์ servlet ของคุณแทนที่จะปล่อยให้ตรรกะของแอปพลิเคชันของคุณ (ผ่านตัวกรองเช่น GuiceFilter):
แม็พโฟลเดอร์กับไฟล์รีซอร์สแบบคงที่ของคุณกับ servlet เริ่มต้น สร้างตัวกรอง servlet และวางไว้หน้า GuiceFilter ใน web.xml ของคุณ ในตัวกรองที่คุณสร้างขึ้นคุณสามารถแยกระหว่างการส่งต่อคำขอบางอย่างไปยัง 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");
}
}
น่าเสียดายที่หากคุณต้องการข้ามขั้นตอนเดียวในห่วงโซ่ตัวกรองในขณะที่รักษาขั้นตอนต่อไปนี้จะไม่ได้ผล