Filter(过滤器)快速入门

概述:

Filter是Javaweb三大组件(Serclet 、Filter、Listener)之一,可以把对资源的请求拦截下来,实现一些特殊的功能,例如:登录校验、统一编码处理、敏感字符处理等

Filter初体验

Filter 过滤器的使用步骤:

1、定义Filter:定义一个类,实现Filter接口,并重写其所有方法。

2、配置Filter:配置Filter的拦截路径,有两种方式:一种是注解,一种是xml方式,我们在这里针对注解进行讲解。在@WebFilter注解里面配置项有许多,我们就不一一演示了,简略介绍在下方,仅供参考:

  • filterName:该filter的名字
  • initParams:初始化参数
  • displayName:filter显示名称
  • servletNames:指定对哪些servlet进行过滤
  •  asyncSupported:是否支持异步模式
  • urlPatterns:指定拦截路径
  • value:指定拦截路径
@WebFilter(urlPatterns = {"/*","/login"})//拦截请求路径,可配置多个,加花括号用逗号隔开,/*拦截所有请求
public class filter implements Filter {
    @Override//初始化方法,web服务器启动,创建Filter时调用,只调用一次
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init 初始化方法执行了");
    }

    @Override//拦截到请求时,调用方法,可以调用多次
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截到了请求");
//放行操作,只有放行了之后才能访问到对应的资源
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override//销毁方法时,服务器关闭调用,只调用一次
    public void destroy() {
        System.out.println("destroy 销毁方法执行了");
    }
}

 要想使用Javaweb的三大组件,还要在他的启动类上加上@ServletComponentScan代表对servlet

组件的支持

注意:urlPatterns和value是一样的。urlPatterns和value只能配置一个,不能两个都配置,两个都配置就会报错。


Filter拦截路径

Filter可以根据需要,配置不同的拦截资源路径

拦截路径urlPatterns值含义
拦截具体路径/login只有访问/login路径时,才会被拦截
目录拦截/demo/*访问/demo下的所有资源,都会被拦截
拦截所有/*访问所有资源,都会被拦截


过滤器链

介绍:

在一个 Web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以针对某一个 URL 进行拦截。如果多个 Filter 程序都对同一个 URL 进行拦截,那么这些 Filter 就会组成一个Filter 链(也称过滤器链)


过滤器链的使用步骤:

1、创建多个过滤器

① ABC

package com.example.Filter;

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

public class ABC implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {


    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("ABC拦截到了请求");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

② Demo

package com.example.Filter;

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

public class Demo implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {


    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Demo拦截到了请求");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

2、运行项目并查看结果


过滤器链执行顺序

执行顺序和类名字符排序有关!

将ABC类名修改成XBC之后,运行项目并查看结果

发现确实改变了,Filter的执行顺序

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值