這里介紹兩種幾種種自定義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--------");
}
}