05-过滤器

nobility 发布于 2021-09-10 2914 次阅读


过滤器

过滤器是对请求进行拦截,进行预处理或后处理,常见的过滤器使用场景有:

  • 权限访问控制
  • 请求字符集编码统一处理
  • 内容敏感词过滤
  • 响应信息压缩

简单使用

使用方式与Servlet一样,需要实现Filter接口,与Servlet不同的是Filter的生命周期,Filter本身就是采用预加载的方式进行实例的创建

对同一个URL地址中,可有多个过滤器来形成过滤器链,执行顺序由web.xml中注册的顺序决定

package com;

import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
  public MyFilter() {
    System.out.println("MyFilter 实例被创建");
  }

  public void destroy() {
    System.out.println("filter 销毁");
  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    System.out.println("filter 执行");
    //若想使用HttpServletRequest和HttpServletResponse则需要向下转型
    chain.doFilter(request, response);  //调用该方法将请求响应向下一个过滤器或Servlet转发,否则会在此处断链
  }

  public void init(FilterConfig config) {
    System.out.println("filter 初始化");
  }

}

web.xml中的配置

<filter>
  <filter-name>MyFilter</filter-name>
  <filter-class>com.MyFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>MyFilter</filter-name>
  <url-pattern>/myservlet</url-pattern>
</filter-mapping>

通常用法

同样Filter也提供了注解的方式配置URL,但是对于过滤器链执行顺序就不确定了,经过测试顺序是按照过滤器的名字升序进行执行的

package com;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(filterName = "Filter1", urlPatterns = "/myservlet")  //filterName会决定过滤器链的执行顺序
public class MyFilter implements Filter {
  //destroy()和init()方法是Filter接口的默认方法,可以不实现
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    System.out.println("filter 执行");
    chain.doFilter(request, response);  //调用该方法将请求响应向下一个过滤器或Servlet转发,否则会在此处断链
  }
}

过滤器的其他配置

默认情况下过滤器只对URL请求拦截一次,若想在请求转发中也拦截请求,则需要在web.xml中配置dispatcher标签定义拦截方式,过滤器的四种调度方式:

  • REQUEST:URL请求方式,默认
  • INCLUDE:JSP的include指令方式
  • FORWARD:请求转发方式
  • ERROR:错误请求方式
<filter>
  <filter-name>MyFilter</filter-name>
  <filter-class>com.MyFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>MyFilter</filter-name>
  <url-pattern>/myservlet</url-pattern>
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>FORWARD</dispatcher>	<!--此时请求也会拦截请求转发方式的请求-->
</filter-mapping>
此作者没有提供个人介绍
最后更新于 2021-09-10