Filter过滤器

Posted zpkang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter过滤器相关的知识,希望对你有一定的参考价值。

Filter过滤器

过滤器是一个实现了javax.servlet.Filter接口的 Java 类, 可以配置多个

技术图片

Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。

可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 html 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。

Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:

  • 在客户端的请求访问后端资源之前,拦截这些请求。
  • 在服务器的响应发送回客户端之前,处理这些响应。

过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明,然后映射到您的应用程序的部署描述符中的 Servlet 名称或 URL 模式。

当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例。

Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。

Servlet 过滤器方法

过滤器的类通常需要实现Filter接口

javax.servlet.Filter 接口定义了三个方法:

方法及说明说明
public void init(FilterConfig filterConfig)
web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
public void doFilter (request, response, chain)
该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。
chain用户访问后续过滤器。
执行了request.doFilter(request, response); 才能通过, 不执行这句代码就会对请求进行拦截
public void destroy()
Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。(一次会话结束后调用, 也就是session失效后)

过滤器方法的执行顺序: init -> doFilter -> destory()

web.xml配置过滤器

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>cn.test.MyFilter</filter-class>
    <!--init-param标签可不写-->
    <init-param> 
        <param-name>name</param-name>
        <param-value>张三</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

常用标签配置说明:

  • <filter>指定一个过滤器。
    • <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
    • <filter-class>元素用于指定过滤器的完整的限定类名。
    • <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
  • <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
    • <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
    • <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
  • <servlet-name>指定过滤器所拦截的Servlet名称。

FilterConfig的使用

FilterConfig是用来获取<init-param>标签中初始化的参数用的, 只能再init方法中使用FilterConfig

如 web.xml 文件配置如下:

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>cn.test.MyFilter</filter-class>
    <init-param> <!--设置初始化参数-->
        <param-name>name</param-name>
        <param-value>张三</param-value>
    </init-param>
</filter>

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

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    // 获取初始化参数
    String name = filterConfig.getInitParameter("name");
    // 输出初始化参数
    System.out.println(name);
}

过滤器案例

1. 新建过滤器类

在新建类cn.text.MyFilter 并实现Filter接口, 重写Filter接口的方法

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String name = filterConfig.getInitParameter("name");
        System.out.println(name);
        String age = filterConfig.getInitParameter("age");
        System.out.println(age);
        System.out.println("init");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("doFilter");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

2. 配置web‘xml

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>cn.test.MyFilter</filter-class>
    <init-param>
        <param-name>name</param-name>
        <param-value>张三</param-value>
    </init-param>
    <init-param>
        <param-name>age</param-name>
        <param-value>15</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3. 任意写一个servlet

代码略

4. 执行结果:

张三
15
init
doFilter

当session超时或者关闭tomcat服务器的时候会再输出

destroy





以上是关于Filter过滤器的主要内容,如果未能解决你的问题,请参考以下文章

基于内部片段的graphql过滤器(gatsbyJS)

使用Logstash filter grok过滤日志文件

servlet,过滤器,监听器,拦截器的区别

vue实现简单的过滤器

Scapy BPF 过滤器不工作

在着色器中访问时,OpenGL如何决定使用MAG_FILTER和MIN_Filter?