过滤器/拦截器
1、无论是请求还是响应都会被过滤器拦截
2、需要等待过滤器放行
过滤器作用
- 过滤乱码
- 限制资源访问
过滤器的实现
1、实现一个Filter接口(init()、destroy()的原理和执行时机和Servlet一样)
public class MyFilter implements Filter{
public void destroy() {
System.out.println("Filter.destroy");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain Chain)
throws IOException, ServletException {
System.out.println("拦截请求");
Chain.doFilter(request,response); //放行
System.out.println("拦截响应");
}
public void init(FilterConfig arg0) throws ServletException {
System.out.println("Filter.init");
} //第一个过滤器
}
2、在web.xml中配置过滤器,类似servlet
<filter>
<filter-name>MyServlet</filter-name>
<filter-class>my.student.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyServlet</filter-name>
<!--/*表示拦截一切请求-->
<!--/MyServlet表示只拦截特定请求-->
<url-pattern>/*</url-pattern>
<!--拦截HTTP请求-->
<dispatcher>REQUEST</dispatcher>
<!--拦截请求转发请求-->
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
通配符
dispatcher请求方式:
REQUEST:拦截HTTP请求
FORWORD:只拦截 通过 请求转发方式的请求
INCLUDE:只拦截通过request.getRequestDispatcher("").indeclude()、通过<jsp:include page="…">发出的请求
ERROR:只拦截<error - page>发出的请求
通过doFilter()处理拦截,并且通过chain.doFilter(request,response)放行
Chain.doFilter(request,response); //放行
注意:
在过滤器中doFilter方法的参数:ServletRequest、ServletResponse
而在Servlet中doGet方法的参数:HttpServletRequest、HttpServletResponse
过滤器链
可以增加多个过滤器Filter,过滤器处理的顺序由web.xml中配置的filter-mapping顺序决定