自定義過濾器filter

這里介紹兩種幾種種自定義filter的方式

  • 通過@WebFilter+@ServletComponentScan的方式
  • 通過配置FilterRegistrationBean的方式
  • 通過加注解@component等注入的方式

1.通過@WebFilter+@ServletComponentScan的方式

filter類

package com.d4c.custombean.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;

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

@Slf4j
@Order(1)
@WebFilter(filterName = "firstName",urlPatterns = "/hello/*")
public class FirstFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("FirstFilter init--------");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("FirstFilter doFilter--------");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        log.info("FirstFilter destroy--------");
    }
}

啟動(dòng)類上要加@ServletComponentScan

package com.d4c.custombean;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan
@SpringBootApplication
public class CustomBeanApplication {
    public static void main(String[] args) {
        SpringApplication.run(CustomBeanApplication.class, args);
    }
}

@WebFilter常用屬性

屬性 類型 是否必需 說明
asyncSupported boolean 指定Filter是否支持異步模式
dispatcherTypes DispatcherType[] 指定Filter對(duì)哪種方式的請(qǐng)求進(jìn)行過濾。 支持的屬性:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST; 默認(rèn)過濾所有方式的請(qǐng)求
filterName String Filter名稱
initParams WebInitParam[] 配置參數(shù)
displayName String Filter顯示名
servletNames String[] 指定對(duì)哪些Servlet進(jìn)行過濾
urlPatterns/value String[] 兩個(gè)屬性作用相同,指定攔截的路徑

過濾器的urlPatterns的過濾路徑規(guī)則:

  • 1.全路徑匹配: /hello/do.html
  • 2.部分路徑匹配: /hello/*
  • 3.通配符匹配 :/*
  • 4.后綴名匹配 :*.html(注意:前面不加/)

@Order
@Orde注解是決定著執(zhí)行順序,而不是類的初始化順序。order數(shù)字越小,優(yōu)先級(jí)越高。最好,統(tǒng)一用一種方式定義filter,否則@Order可能不起作用(混亂)。

2.通過配置FilterRegistrationBean的方式

filter類

package com.d4c.custombean.filter;

import lombok.extern.slf4j.Slf4j;

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

@Slf4j
public class SecondFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("SecondFilter init--------");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("SecondFilter doFilter--------");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        log.info("SecondFilter destroy--------");
    }
}

配置類

package com.d4c.custombean.config;

import com.d4c.custombean.filter.SecondFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyRegisterBean {

    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        //注冊(cè)自定義過濾器
        bean.setFilter(new SecondFilter());
        //過濾器名稱
        bean.setName("second filter bean");
        //過濾所有路徑
        bean.addUrlPatterns("/do/*");
        //優(yōu)先級(jí),數(shù)字越小,優(yōu)先級(jí)越高
        bean.setOrder(2);
        return bean;
    }
}

3.通過加注解@Component等注入的方式

雖然這種方式能實(shí)現(xiàn)filter,但是不推薦。最好第一種或第二種方式選其一

filter類

package com.d4c.custombean.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

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

@Slf4j
@Order(3)
//或者用@Configuration
@Component   
public class ThirdFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("ThirdFilter init--------");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("ThirdFilter doFilter--------");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        log.info("ThirdFilter destroy--------");
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容