Spring Boot 自定義 Filter

程序員社區 2022-01-07 13:38:32 阅读数:239

spring boot 自定 filter

       在 Spring Boot 之前自定義 Filter 的配置,都是在
webapp/WEB-INF/web.xml 文件下來配置;或者說使用 @WebFilter 注解的方式來配置。在使用 Spring Boot 開發 Web 項目時,並沒有 web.xml 配置文件的存在,所以
Spring Boot 為我們提供了兩種方式來將我們自定義的 Filter注册到 Spring 容器中。

  1. 使用 @WebFilter 注解方式
  2. 通過 FilterRegistrationBean類的方式

1.使用 @WebFilter 注解方式

1.1 自定義 MyFilter 類

       自定義一個 MyFilter 類,添加注解@WebFilter,通過 value/urlPattern 屬性來指定映射的 URL。

/** * TODO 自定義Filter * * @author liuzebiao * @Date 2020-4-2 15:27 *///@WebFilter(value = {"/myTest","/filter"},filterName="myFilter") //指定vlaue屬性 和 urlPattern屬性均可以@WebFilter(urlPatterns = {
"/myFilter","/filter"},filterName="MyFilter")public class MyFilter implements Filter {
 @Override public void init(FilterConfig filterConfig) throws ServletException {
 System.out.println("init 方法"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 System.out.println("開始執行 Filter"); //獲取URL請求參數 Enumeration enu = request.getParameterNames(); while (enu.hasMoreElements()) {
 String paraName = (String) enu.nextElement(); System.out.println(paraName + ": " + request.getParameter(paraName)); } //執行過濾器 chain.doFilter(request, response); } @Override public void destroy() {
 System.out.println("destroy 方法"); }}

1.2 添加 @ServletComponentScan 注解

       在Spring Boot 啟動類上,添加一個 @ServletComponentScan 注解

@ServletComponentScan@SpringBootApplicationpublic class BootApplication {
 public static void main(String[] args) {
 // Spring應用啟動起來  SpringApplication.run(BootApplication.class,args); }}

2.編寫FilterRegistrationBean類的方式

2.1 同樣先自定義一個 MyFilter(代碼同1.1中 MyFilter,唯一區別是不需要加@WebFilter注解)

/** * TODO 自定義Filter * * @author liuzebiao * @Date 2020-4-2 15:27 */public class MyFilter implements Filter {
 @Override public void init(FilterConfig filterConfig) throws ServletException {
 System.out.println("init 方法"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 System.out.println("開始執行 Filter"); //獲取URL請求參數 Enumeration enu = request.getParameterNames(); while (enu.hasMoreElements()) {
 String paraName = (String) enu.nextElement(); System.out.println(paraName + ": " + request.getParameter(paraName)); } //執行過濾器 chain.doFilter(request, response); } @Override public void destroy() {
 System.out.println("destroy 方法"); }}

2.2 添加 Spring Boot 配置類,將自定義的 MyServlet 注册到容器中

@Configurationpublic class MyServerConfig {
 //注册Filter組件 @Bean public FilterRegistrationBean myFilter(){
 FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new MyFilter()); filterRegistrationBean.setUrlPatterns(Arrays.asList("/myFilter","/filter")); return filterRegistrationBean; }}

       當我們訪問 /myFilter 請求時,便會執行到我們自定義的 MyFilter中。Filter URL映射地址,接收可變參數,支持同時配置多個 URL 地址。如下所示:

@Beanpublic FilterRegistrationBean myFilter(){
 FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new MyFilter()); filterRegistrationBean.setUrlPatterns(Arrays.asList("/myTest","/filter")); return filterRegistrationBean;}
@WebFilter(urlPatterns = {
"/myFilter","/filter"},filterName="myFilter")public class MyFilter implements Filter {
}

Spring Boot 自定義 Filter,介紹到此為止

如果本文對你有所幫助,那就給我點個贊唄

End

版权声明:本文为[程序員社區]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071338320678.html