Filter(过滤器)

Filter(过滤器)

过滤器介绍

web过滤器:过滤器实现对web资源请求的拦截,完成特殊的功能操作,尤其是对请求的预处理。

作用:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤...

过滤器工作流程

过滤器生命周期

  • init():在服务器启动后,会创建Filter实例对象,然后调用init()方法,进行初始化。只执行一次。用于加载资源
  • doFilter():拦截请求处理,完成指定功能,每一次请求被拦截资源时,都会执行。
  • destroy():Filter对象会驻留在内存中,在服务器关闭后会调用destroy()方法,Filter对象才被销毁。用于释放资源。

简单实现过滤器

  • 编写java类实现Filter接口,实现doFilter()方法
  • 配置web.xml文件,对filter类注册,并设置拦截请求

FilterDemo1.java

package filter;

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

public class FilterDemo1 implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("过滤器执行了....");
        //请求传回过滤链
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

web.xml配置

  <filter>
        <filter-name>demo1</filter-name> 
        <filter-class>filter.FilterDemo1</filter-class>
  </filter>
  <filter-mapping>
        <filter-name>demo1</filter-name>
        <url-pattern>/*</url-pattern>   //拦截路径
  </filter-mapping>

FilterConfig 使用

Filter 的 init 方法中提供了一个 FilterConfig 对象。

如 web.xml 文件配置如下:

<filter>
    <filter-name>FilterDemo</filter-name>
    <filter-class>filter.FilterDemo</filter-class>
    <init-param>
        <param-name>initparam</param-name>
        <param-value>我是初始化参数</param-value>
    </init-param>
    </filter>

在 init 方法使用 FilterConfig 对象获取参数:

public void  init(FilterConfig config) throws ServletException {
    // 获取初始化参数
    String initparam = config.getInitParameter("initparam"); 
    // 输出初始化参数
    System.out.println("初始化参数: " + initparam); 
}

关于过滤器配置

关于过滤器配置方式有两种:一种是配置web.xml文件,另外一种就是注解的方式。

  • 配置web.xml文件
  <filter>
        <filter-name>demo1</filter-name>        //过滤器名				
        <filter-class>filter.FilterDemo1</filter-class>   //类所在的包
  </filter>
  <filter-mapping>
        <filter-name>demo1</filter-name>
        <url-pattern>/*</url-pattern>   // filter 所拦截的请求路径
        <dispatcher>REQUEST</dispatcher>  //指定过滤器所拦截的资源被 Servlet 容器调用的方式
  </filter-mapping>
  • 使用注解
@WebFilter("/*")
@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.REQUEST)

资源被访问的方式
①在web.xml中配置标签
②在注解中设置dispatcherTypes属性

访问方式:

  1. REQUEST:默认值。浏览器直接请求资源
  2. FORWARD:转发访问资源
  3. INCLUDE:包含访问资源
  4. ERROR:错误跳转资源
  5. ASYNC:异步访问资源

过滤器的应用顺序

当配置多个过滤器,形成过滤链时,过滤器的执行顺序为web.xml配置中定义的先后顺序来执行。若使用注解配置,则会按照类名的字串符比较规则,值小的先执行。

原文地址:https://www.cnblogs.com/jascen/p/11293798.html