什么是过滤器
过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。
- 当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。
- 其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码。
过滤器实现
Filter接口
public class HelloFilter implements Filter {
初始化:创建后马上执行 --- Filter在服务器启动时创建
public void init (FilterConfig filterConfig) throws ServletException {}
每次过滤时执行
public void doFilter (ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Hello Filter");
}
销毁前 --- 服务器关闭时销毁
public void destroy () {}
}
FilterConfig参数
- 获取初始化参数:getInitParameter()
- 获取过滤器名称:getFilterName()
- 获取appliction:getServletContext()
FilterChain参数
- doFilter(ServletRequest, ServletResponse):放行!
放行,就相当于调用了目标Servlet的service()方法!
Filter配置
<filter>
<filter-name>helloFilter</filter-name>
<filter-class>cn.itcast.filter.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>helloFilter</filter-name>
<url-pattern>/index.jsp </url-pattern> /*通配符
</filter-mapping>
多个过滤器的执行顺序
<filter-mapping>
的配置顺序决定了过滤器的执行顺序!
四种拦截方式
其实过滤器有四种拦截方式!分别是:REQUEST、FORWARD、INCLUDE、ERROR。
可配置多个
<dispatcher>REQUEST</dispatcher>默认的!
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
在<filter-mapping>中进行配置!
- REQUEST:直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;
- FORWARD:转发访问执行过滤器。包括
RequestDispatcher#forward()
方法、<jsp:forward>
标签都是转发访问; - INCLUDE:包含访问执行过滤器。包括
RequestDispatcher#include()
方法、<jsp:include>
标签都是包含访问; - ERROR:当目标资源在web.xml中配置为
<error-page>
时,并且真的出现了异常,转发到目标资源时,会执行过滤器。