Servlet过滤器是一个可以拦截HTTP请求的Java对象。
servlet过滤器可以拦截servlet、JSP、HTML以及其他静态内容的http请求,如下图所示:
创建servlet过滤器,只需继承javax.servlet.Filter
接口,如下所示:
import javax.servlet.*;
import java.io.IOException;
public class MyServletFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain)
throws IOException, ServletException {
}
public void destroy() {
}
}
如同servlet,过滤器在初次加载时,也将调用init()
方法初始化。
当http请求到达时,过滤器可以读取URI,请求报头,请求体等,在过滤器中可以阻塞或继续转发请求。
执行过滤的是doFilter()
方法:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
String myParam = request.getParameter("myParam");
if(!"block".equals(myParam)){
filterChain.doFilter(request, response);
}
}
如上所示,doFilter()
方法中首先读取参数myParam,检查是否等于“block”,如果不是,调用filter.dofilter()
方法继续转发请求,否则不调用此方法阻塞请求。
如同Servlet,过滤器中也可输出响应内容,通过使用ServletResponse
参数。
示例:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain)
throws IOException, ServletException {
String myParam = request.getParameter("myParam");
if(!"block".equals(myParam)){
filterChain.doFilter(request, response);
return;
}
HttpResponse httpResponse = (HttpResponse) response;
httpResponse.getWriter().write("来自过滤器");
}
如上所示,将ServletResponse
转换为HttpResponse
,然后获取PrintWriter
输出响应。
web.xml中配置Servlet过滤器
Servlet过滤器需要在web.xml配置后才能使用:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>servlets.MyServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>*.test-filter</url-pattern>
</filter-mapping>
如上所示,URL以.test-filter
结尾的所有请求都将被servlet过滤器拦截,其他的不会受到影响。