10.Filter
一、简介
- Filter翻译过来叫过滤器,用来拦截请求,是服务器端的三大组件之一
- 服务器端的三大组件:Servlet、Filter、Listener
- 服务器端三大组件的特点
- 它们都需要实现某一个接口
- 它们都需要在web.xml中进行注册
- 它们的对象都由服务器创建,并且在特定的时机自动调用对应的方法
二、HelloWorld
package com.atguigu.filter;
import javax.servlet.*;
import java.io.IOException;
public class HelloFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("此山是我开,此树是我栽,要想从此过,留下买路财!");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
- 2)在web.xml中注册Filter接口的实现类
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>HelloFilter</filter-name>
<filter-class>com.atguigu.filter.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HelloFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
</web-app>
- 3)发送请求,如果请求地址与web.xml配置文件的url-pattern标签中的配置的地址一致,那么过滤器就会自动调用doFilter方法拦截该请求
- 4)可以通过doFilter方法中的参数FilterChain对象放行请求、
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("此山是我开,此树是我栽,要想从此过,留下买路财!");
filterChain.doFilter(servletRequest,servletResponse);
}
- 过滤器的作用
- 请求到达请求的资源之前拦截请求
- 满足要求放行请求
- 在响应到达浏览器之前做一些其他的操作
- 过滤器只拦截请求,不拦截响应
三、Filter的生命周期
- Filter的生命周期即Filter对象从被创建到被销毁的过程
- Filter的生命周期主要体现在以下方法中
- 构造器
- 服务器一启动就调用,说明服务器一启动就创建Filter对象
- 在整个生命周期过程中只会调用一次,说明Filter也是单例的
- init(FilterConfig filterConfig)
- 服务器一启动就调用,用来初始化Filter对象
- 在整个生命周期过程中只会调用一次
- 该方法中参数filterConfig的作用
- 1)获取Filter的名称
- 2)获取Filter的初始化参数
- 3)获取ServletContext对象
- doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
- 当发送的请求是标签中配置的拦截的路径的时候调用,用来拦截该请求
- 在整个生命周期过程中可以调用多次
- 该方法中参数的作用
- servletRequest与servletResponse与Servlet中service()方法中的作用一样
- filterChain参数的作用是放行请求
- destroy()
四、多个Filter的执行顺序
- 我们可以为同一个资源配置多个Filter,多个Filter组成一个Filter链,多个Filter的执行顺序由web.xml配置文件中的标签决定,在前的先拦截,在后的后拦截
<filter>
<filter-name>HelloFilter</filter-name>
<filter-class>com.atguigu.filter.HelloFilter</filter-class>
</filter>
<filter>
<filter-name>HelloFilter2</filter-name>
<filter-class>com.atguigu.filter.HelloFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>HelloFilter2</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>HelloFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
五、url-pattern的配置规则
- 精确匹配
- 配置一个完整的路径
- 除了可以通过url-pattern标签配置拦截的路径外,还可以通过标签配置
- 例如:UserServlet
- 等价于/UserServlet
- 当向UserServlet发送请求时就会被过滤器拦截
- 模糊匹配