过滤器(Filter)的实现方式

本文介绍了在Spring Boot应用中实现过滤器Filter的三种方法:1) 使用@Component注解注册到Spring;2) 结合@Configuration和@Bean创建配置类进行装配;3) 通过@WebFilter注解直接声明过滤器。每种方式都详细说明了实现步骤和注意事项。

Filter是单例的。实现过滤器(Filter)首先需要实现Filter类。
具体实现方式有3种:

  1. 实现Filter类,使用@Component注解注册到Spring
  2. 实现Filter类,使用@Configuration注解,用配置bean的方式装配
  3. 实现Filter类,使用@WebFilter注解

1.实现Filter类,使用@Component注解注册到Spring

package com.example.filter;

import org.springframework.stereotype.Component;

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

/**
 * 使用@Component将其注册到Spring
 */
@Component
public class MyFilter implements Filter {

	//创建之后,马上执行;Filter会在服务器启动时就创建!
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("MyFilter.init");
    }


     /**
     * 过滤器的主要逻辑在doFilter上
     * 每次过滤时都会执行
     *
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("MyFilter start");
        Long startTime = new Date().getTime();
        chain.doFilter(request, response);
        System.out.println("MyFilter 耗时:" + (new Date().getTime() - startTime));
        System.out.println("MyFilter end");
    }

	 //销毁之前执行!在服务器关闭时销毁
    @Override
    public void destroy() {
        System.out.println("MyFilter.destroy>>>>>>>>>");
    }
}

2.实现Filter类,使用@Configuration注解,用配置bean的方式装配
以上代码不变,但是MyFilter类需要去掉@Component。然后再自定义一个配置类

package com.example.filter;

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

public class MyFilter implements Filter {

	//创建之后,马上执行;Filter会在服务器启动时就创建!
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("MyFilter.init");
    }

     /**
     * 过滤器的主要逻辑在doFilter上
     * 每次过滤时都会执行
     *
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("MyFilter start");
        Long startTime = new Date().getTime();
        chain.doFilter(request, response);
        System.out.println("MyFilter 耗时:" + (new Date().getTime() - startTime));
        System.out.println("MyFilter end");
    }

	 //销毁之前执行!在服务器关闭时销毁
    @Override
    public void destroy() {
        System.out.println("MyFilter.destroy>>>>>>>>>");
    }
}
package com.example.filter;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig {
    @Bean
    public FilterRegistrationBean registrationBean(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new MyFilter());
        registrationBean.addUrlPatterns("/*");//过滤请求路径 所有请求
        registrationBean.setName("myFilter");
        registrationBean.setOrder(1);//值越小优先级越高
        return registrationBean;
    }
}

3.实现Filter类,使用@WebFilter注解

@WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性 ( 以下所有属性均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值 )

@WebFilter 的常用属性
在这里插入图片描述

package com.example.filter;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

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


@Order(value = 1)//值越小优先级越高
@Configuration
@WebFilter(urlPatterns = "/*" ,filterName = "myFilter")
public class MyFilter implements Filter {

    //创建之后,马上执行;Filter会在服务器启动时就创建!
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("MyFilter.init");
    }
    
    /**
     * 过滤器的主要逻辑在doFilter上
     * 每次过滤时都会执行
     *
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("MyFilter start");
        Long startTime = new Date().getTime();
        chain.doFilter(request, response);
        System.out.println("MyFilter 耗时:" + (new Date().getTime() - startTime));
        System.out.println("MyFilter end");
    }

    //销毁之前执行!在服务器关闭时销毁
    @Override
    public void destroy() {
        System.out.println("MyFilter.destroy>>>>>>>>>");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值