过滤器的使用
- 过滤器介绍
- 过滤器的使用
- 配置过滤器
- 过滤器路径的配置规则
- 前置、后置、环绕过滤器
- 过滤器链
- 过滤器的优先级
过滤器介绍
过滤器(Filter)是位于客户端与服务器资源之间的一道过滤技术,可以在客户端请求到达目标资源之前进行预处理业务。
过滤器作用
- 执行多个Servlet公共的代码,解决了代码的冗余性问题,提高代码复用性(例如首先资源的登录验证)
过滤器的使用
- 1.创建一个类实现javax.servlet.Filter接口
- 2.实现Filter接口中的init、doFilter、destroy抽象方法
init 是过滤器初始化方法,用于获取过滤器的初始化参数等
destory 是过滤器的销毁方法,用以释放资源
doFilter 方法 用于定义过滤器的业务 - 3.在doFilter实现过滤器业务
public class Filter_demo2 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("--------Filter");
//放行:运行继续执行浏览器请求的目标资源
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
配置过滤器
- xml配置-----在web.xml中进行配置
<filter>
<filter-name>Filter_demo2</filter-name>
<!-- 拦截器的路径位置-->
<filter-class>com.powernode.Filter.Filter_demo2</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter_demo2</filter-name>
<!-- 要拦截指定的请求url-->
<url-pattern>/filter1</url-pattern>
</filter-mapping>
- 注解配置------在过滤器类添加 @WebFliter() 注解
@WebFilter("/filter1")
public class Filter_demo2 implements Filter {
过滤器路径的配置规则
精确过滤: 配置过滤器拦截指定的请求url
- 例如:/FirstServlet,/index.html
后缀过滤: 配置过滤器拦截指定的后缀的请求url
- 例如:*.jpg 、 *.html
通配符过滤:
- /* 拦截所有请求
- /aaa/bbb/* 拦截项目名后 demo1/aaa/bbb/FirstServlet 或者 demo8/aaa/bbb/a.html
前置、后置、环绕过滤器
根据过滤器在目标资源执行的时机,我们可以将过滤器分为三类:
- 前置过滤器:过滤器在目标资源之前执行
- 后置过滤器:过滤器在目标资源之后执行
- 环绕过滤器:执行目标资源之前会执行过滤器,目标资源执行之后还会执行过滤器
过滤器链
在同一个服务器资源(Servlet类)上可以添加多个过滤器,当用户请求资源时,会依次执行每一个过滤器,然后再执行目标资源,再依次通过过滤器响应客户端请求。
过滤器的优先级
过滤器优先级:在一个web项目中如果配置多个过滤器,多个过滤器的先后执行顺序
- 如果多个过滤器都是使用注解配置的,则按照过滤器类的名称字符串的字典顺序执行;
- 如果多个过滤器都是在web.xml中配置的,则按照web.xml配置的先后顺序执行;
- web.xml中配置的过滤器优先级高于注解配置;
- 如果同一个过滤器通过注解及web.xml两种方式都进行了配置,过滤器会执行多次。