Filter过滤器

Posted cgblpx

tags:

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

概述

过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理
通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理
通常用来做一些通用配置,比如:权限验证,登录验证,乱码处理等

入门案例

实现Filter接口,重写一些方法,配置过滤规则

测试

package cn.tedu.filterdemo;

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

@WebFilter("/*")//拦截所有请求,只要访问这个项目里的资源,全都拦截,不放行就阻塞
public class MyFilter implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filter上线...");
        chain.doFilter(req, resp);//放行,否则就阻塞住了
    }
    public void init(FilterConfig config) throws ServletException {

    }

}

在web.xml里配置过滤器信息

配置过滤器的过滤规则,可以使用注解指定,也可以在web.xml里配置,二选一即可

web.xml内容

 <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>cn.tedu.filterdemo.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Filter生命周期

Filter的生命周期中,包含着几个方法,不同阶段服务器会调用不同的方法,包括init() destory() doFilter()

测试

package cn.tedu.filterdemo;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class Filter3 implements Filter {
   //在服务器启动时,就会自动创建Filter对象,并执行init,通常用来完成项目的初始化,而且只执行1次
    public void init(FilterConfig config) throws ServletException {
        System.out.println("filter init...");
    }
    //每次拦截到请求后,都会执行的一些业务逻辑.会执行多次
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filter doFilter...");
        chain.doFilter(req, resp);
    }
    //服务器正常关闭时会执行,而且只执行1次
    public void destroy() {
        System.out.println("filter destroy...");
    }
}

Filter配置详解

可以有4种配置方式:
1,具体文件: /index.jsp ,是指只有访问index.jsp这一个资源时,过滤器会被执行
2,匹配前缀: /user/* ,是指访问user下的所有资源时,过滤器会被执行
3,匹配后缀: * .jsp, 是指访问所有后缀名为jsp的文件时,过滤器会被执行
4,匹配所有: /* ,是指访问所有资源时,过滤器会被执行

测试

package cn.tedu.filterdemo;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//@WebFilter("/hello1.html") //只拦截固定资源
//@WebFilter("/user/*") //按照请求前缀拦截
//@WebFilter("*.jsp") //按照请求后缀拦截
@WebFilter("/*") //啥都拦截
public class Filter4 implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filter doFilter....");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

FilterChain过滤器链

执行顺序:

有多个过滤器配置时,依次按照:
过滤器1
过滤器2
执行资源
过滤器2
过滤器1

过滤器的先后顺序

注解配置: 哪个过滤器将会先被执行,会按照类名的字符串比较规则,较小的先执行.如: AFilter先于BFilter执行,Filter3先于Filter4执行
web.xml配置: 依次按照的顺序执行,谁在上面就先执行谁

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

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

使用Logstash filter grok过滤日志文件

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

vue实现简单的过滤器

Scapy BPF 过滤器不工作

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