自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

花式玩 Spring Boot!過濾器竟有 N 種注冊方式!手把手教你

開發(fā) 開發(fā)工具
要說在 Spring Boot 中注冊過濾器有三種方式,你都能想到哪些呢?今天松哥就來和大家聊一聊 Spring Boot 中注冊過濾器的三種方式!

 要說在 Spring Boot 中注冊過濾器有三種方式,你都能想到哪些呢?今天松哥就來和大家聊一聊 Spring Boot 中注冊過濾器的三種方式!

[[330681]]

其實(shí)本來是想和大家聊 Spring Security 過濾器鏈的問題的,結(jié)果看源碼看著看著就跑題了,索性就先和大家聊一聊 Spring Boot 中注冊過濾器的三種方式,算是給 后面的 Spring Security 打一點(diǎn)基礎(chǔ)。

1.@WebFilter

通過 @WebFilter 注解來標(biāo)記一個(gè)過濾器,這種方式相信大家很容易想到。這是將 Servlet 中的那一套東西直接拿到 Spring Boot 上用。

具體做法就是通過 @WebFilter 注解來標(biāo)記一個(gè) Filter,如下:

 

  1. @WebFilter(urlPatterns = "/*"
  2. public class MyFilter implements Filter { 
  3.  
  4.     @Override 
  5.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
  6.         System.out.println("-----doFilter-----"); 
  7.         chain.doFilter(request, response); 
  8.     } 

在 @WebFilter 注解中可以配置過濾器的攔截規(guī)則。這個(gè)注解要生效,還需要我們在項(xiàng)目啟動(dòng)類上配置 @ServletComponentScan 注解,如下:

  1. @SpringBootApplication 
  2. @ServletComponentScan 
  3. public class FilterdemoApplication { 
  4.  
  5.     public static void main(String[] args) { 
  6.         SpringApplication.run(FilterdemoApplication.class, args); 
  7.     } 
  8.  

@ServletComponentScan 注解雖然名字帶了 Servlet,但是實(shí)際上它不僅僅可以掃描項(xiàng)目中的 Servlet 容器,也可以掃描 Filter 和 Listener。

這是我們在 Spring Boot 中使用過濾器的第一種方式,在實(shí)際項(xiàng)目中,這種方式使用較少,因?yàn)檫@種方式有一個(gè)很大的弊端就是無法指定 Filter 的優(yōu)先級(jí),如果存在多個(gè) Filter 時(shí),無法通過 @Order 指定優(yōu)先級(jí)。

2.@Bean

第二種方式就是將過濾器配置成 Bean,注冊到 Spring 容器中去。這種方法不再需要 @ServletComponentScan 注解,只要一個(gè) Bean 即可,如下:

  1. @Component 
  2. public class MyFilter implements Filter { 
  3.  
  4.     @Override 
  5.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
  6.         System.out.println("-----doFilter-----"); 
  7.         chain.doFilter(request, response); 
  8.     } 

這種方式看起來很方便,一個(gè)注解將 Filter 納入到 Spring 容器中即可。而且這種方式還有一個(gè)優(yōu)勢,就是如果存在多個(gè) Filter,可以通過 @Order 注解指定多個(gè) Filter 的優(yōu)先級(jí),像下面這樣:

  1. @Component 
  2. @Order(-1) 
  3. public class MyFilter implements Filter { 
  4.  
  5.     @Override 
  6.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
  7.         System.out.println("-----doFilter-----"); 
  8.         chain.doFilter(request, response); 
  9.     } 

雖然解決了優(yōu)先級(jí)問題,但是大家發(fā)現(xiàn)這種方式好像沒有辦法設(shè)置 Filter 的攔截規(guī)則!是的,直接定義 Bean 的話,默認(rèn)的攔截規(guī)則就是 /* 即攔截所有請(qǐng)求,開發(fā)者無法進(jìn)行自定義配置。

那么有沒有辦法即配置攔截規(guī)則,又配置優(yōu)先級(jí)呢?接下來介紹的第三種方案可以魚與熊掌兼得。

3.FilterRegistrationBean

第三種方案還是將 Filter 封裝成一個(gè) Bean,但這個(gè) Bean 是 FilterRegistrationBean,通過 FilterRegistrationBean 我們既可以配置 Filter 的優(yōu)先級(jí),也可以配置 Filter 的攔截規(guī)則。

一般在項(xiàng)目中,我們都是使用 FilterRegistrationBean 來配置過濾器,一起來看一個(gè)案例:

  1. @Configuration 
  2. public class FilterConfiguration { 
  3.     @Bean 
  4.     FilterRegistrationBean<MyFilter> myFilterFilterRegistrationBean() { 
  5.         FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<>(); 
  6.         bean.setFilter(new MyFilter()); 
  7.         bean.setOrder(-1); 
  8.         bean.setUrlPatterns(Arrays.asList("/*")); 
  9.         return bean; 
  10.     } 
  11.     @Bean 
  12.     FilterRegistrationBean<MyFilter2> myFilterFilterRegistrationBean2() { 
  13.         FilterRegistrationBean<MyFilter2> bean = new FilterRegistrationBean<>(); 
  14.         bean.setFilter(new MyFilter2()); 
  15.         bean.setOrder(-2); 
  16.         bean.setUrlPatterns(Arrays.asList("/hello")); 
  17.         return bean; 
  18.     } 

4.擴(kuò)展

FilterRegistrationBean 到底是什么來頭呢?這里也和大家分享下。

Spring Boot 為了方便大家向 Servlet 容器中注冊 Servlet、Filter 以及 Listener,提供了一個(gè) Bean 注冊的抽象類 RegistrationBean,如下:

  1. public abstract class RegistrationBean implements ServletContextInitializer, Ordered { 
  2.  private int order = Ordered.LOWEST_PRECEDENCE; 
  3.  private boolean enabled = true
  4.  @Override 
  5.  public final void onStartup(ServletContext servletContext) throws ServletException { 
  6.   String description = getDescription(); 
  7.   if (!isEnabled()) { 
  8.    logger.info(StringUtils.capitalize(description) + " was not registered (disabled)"); 
  9.    return
  10.   } 
  11.   register(description, servletContext); 
  12.  } 
  13.  protected abstract String getDescription(); 
  14.  protected abstract void register(String description, ServletContext servletContext); 
  15.  public void setEnabled(boolean enabled) { 
  16.   this.enabled = enabled; 
  17.  } 
  18.  public boolean isEnabled() { 
  19.   return this.enabled; 
  20.  } 
  21.  public void setOrder(int order) { 
  22.   this.order = order
  23.  } 
  24.  @Override 
  25.  public int getOrder() { 
  26.   return this.order
  27.  } 
  28.  
  1. RegistrationBean 實(shí)現(xiàn)了 ServletContextInitializer 接口,在 Servlet 啟動(dòng)時(shí),RegistrationBean#onStartup 方法會(huì)被調(diào)用,進(jìn)而完成 Filter、Servlet 以及 Listener 的注冊。
  2. enabled 屬性可以理解為一個(gè)開關(guān),設(shè)置為 false 相當(dāng)于關(guān)閉組件注冊。

RegistrationBean 有眾多的實(shí)現(xiàn)類,我們之前使用的 FilterRegistrationBean 只是其中之一:

實(shí)現(xiàn)類的作用一目了然:

  • ServletListenerRegistrationBean 用來注冊監(jiān)聽器。
  • ServletRegistrationBean 用來注冊 Servlet。
  • DispatcherServletRegistrationBean 用來注冊 DispatcherServlet。
  • FilterRegistrationBean 用來注冊過濾器。
  • DelegatingFilterProxyRegistrationBean 則用來注冊 DelegatingFilterProxy,DelegatingFilterProxy 在 Spring Security、Spring Session、Shiro 等整合時(shí)非常有用。

5.小結(jié)

今天就和小伙伴們分享一下 Spring Boot 中過濾器的三種注冊方式,順帶和大家分享了一下 FilterRegistrationBean 的繼承體系,小伙伴們可以根據(jù) FilterRegistrationBean 的繼承體系中的實(shí)現(xiàn)類,自行嘗試一下 Servlet 和 Listener 的注冊方式~本文案例下載地址:https://github.com/lenve/javaboy-code-samples

本文轉(zhuǎn)載自微信公眾號(hào)「江南一點(diǎn)雨」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系江南一點(diǎn)雨公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 江南一點(diǎn)雨
相關(guān)推薦

2023-03-27 08:28:57

spring代碼,starter

2021-06-29 12:27:19

Spring BootCAS 登錄

2025-02-19 08:00:00

SpringBootOllamaDeepSeek

2022-05-10 10:43:35

數(shù)據(jù)源動(dòng)態(tài)切換Spring

2021-07-14 09:00:00

JavaFX開發(fā)應(yīng)用

2019-11-12 10:50:13

Spring BootstarterJava

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機(jī)

2020-06-15 17:20:09

Vim代碼編輯器Linux

2022-07-27 08:16:22

搜索引擎Lucene

2022-01-08 20:04:20

攔截系統(tǒng)調(diào)用

2022-03-14 14:47:21

HarmonyOS操作系統(tǒng)鴻蒙

2023-04-26 12:46:43

DockerSpringKubernetes

2022-12-07 08:42:35

2011-02-22 13:46:27

微軟SQL.NET

2021-12-28 08:38:26

Linux 中斷喚醒系統(tǒng)Linux 系統(tǒng)

2021-02-26 11:54:38

MyBatis 插件接口

2017-07-07 11:01:04

Spark性能調(diào)優(yōu)

2020-08-12 07:41:39

SQL 優(yōu)化語句

2021-07-01 09:31:50

MySQL SQL 語句數(shù)據(jù)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)