最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

手把手教你SpringBoot過(guò)濾器N種注冊(cè)方式

 更新時(shí)間:2020年06月19日 15:09:31   作者:江南一點(diǎn)雨  
這篇文章主要介紹了手把手教你SpringBoot過(guò)濾器N種注冊(cè)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

要說(shuō)在 Spring Boot 中注冊(cè)過(guò)濾器有三種方式,你都能想到哪些呢?今天松哥就來(lái)和大家聊一聊 Spring Boot 中注冊(cè)過(guò)濾器的三種方式!

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

1.@WebFilter

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

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

@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    System.out.println("-----doFilter-----");
    chain.doFilter(request, response);
  }
}

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

@SpringBootApplication
@ServletComponentScan
public class FilterdemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(FilterdemoApplication.class, args);
  }

}

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

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

2.@Bean

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

@Component
public class MyFilter implements Filter {

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    System.out.println("-----doFilter-----");
    chain.doFilter(request, response);
  }
}

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

@Component
@Order(-1)
public class MyFilter implements Filter {

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    System.out.println("-----doFilter-----");
    chain.doFilter(request, response);
  }
}

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

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

3.FilterRegistrationBean

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

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

@Configuration
public class FilterConfiguration {
  @Bean
  FilterRegistrationBean<MyFilter> myFilterFilterRegistrationBean() {
    FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<>();
    bean.setFilter(new MyFilter());
    bean.setOrder(-1);
    bean.setUrlPatterns(Arrays.asList("/*"));
    return bean;
  }
  @Bean
  FilterRegistrationBean<MyFilter2> myFilterFilterRegistrationBean2() {
    FilterRegistrationBean<MyFilter2> bean = new FilterRegistrationBean<>();
    bean.setFilter(new MyFilter2());
    bean.setOrder(-2);
    bean.setUrlPatterns(Arrays.asList("/hello"));
    return bean;
  }
}

4.擴(kuò)展

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

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

public abstract class RegistrationBean implements ServletContextInitializer, Ordered {
 private int order = Ordered.LOWEST_PRECEDENCE;
 private boolean enabled = true;
 @Override
 public final void onStartup(ServletContext servletContext) throws ServletException {
 String description = getDescription();
 if (!isEnabled()) {
  logger.info(StringUtils.capitalize(description) + " was not registered (disabled)");
  return;
 }
 register(description, servletContext);
 }
 protected abstract String getDescription();
 protected abstract void register(String description, ServletContext servletContext);
 public void setEnabled(boolean enabled) {
 this.enabled = enabled;
 }
 public boolean isEnabled() {
 return this.enabled;
 }
 public void setOrder(int order) {
 this.order = order;
 }
 @Override
 public int getOrder() {
 return this.order;
 }

}

RegistrationBean 實(shí)現(xiàn)了 ServletContextInitializer 接口,在 Servlet 啟動(dòng)時(shí),RegistrationBean#onStartup 方法會(huì)被調(diào)用,進(jìn)而完成 Filter、Servlet 以及 Listener 的注冊(cè)。

enabled 屬性可以理解為一個(gè)開(kāi)關(guān),設(shè)置為 false 相當(dāng)于關(guān)閉組件注冊(cè)。

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

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

  • ervletListenerRegistrationBean 用來(lái)注冊(cè)監(jiān)聽(tīng)器。
  • ServletRegistrationBean 用來(lái)注冊(cè) Servlet。
  • DispatcherServletRegistrationBean 用來(lái)注冊(cè) DispatcherServlet。
  • FilterRegistrationBean 用來(lái)注冊(cè)過(guò)濾器。
  • DelegatingFilterProxyRegistrationBean 則用來(lái)注冊(cè) DelegatingFilterProxy,DelegatingFilterProxy 在 Spring Security、Spring Session、Shiro 等整合時(shí)非常有用。

5.小結(jié)

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

到此這篇關(guān)于手把手教你SpringBoot過(guò)濾器N種注冊(cè)方式的文章就介紹到這了,更多相關(guān)SpringBoot過(guò)濾器注冊(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java發(fā)送https請(qǐng)求并跳過(guò)ssl證書(shū)驗(yàn)證方法

    Java發(fā)送https請(qǐng)求并跳過(guò)ssl證書(shū)驗(yàn)證方法

    最近在負(fù)責(zé)一個(gè)對(duì)接第三方服務(wù)的事情,在對(duì)接期間因?yàn)榈谌椒?wù)為https的請(qǐng)求,這篇文章主要給大家介紹了關(guān)于Java發(fā)送https請(qǐng)求并跳過(guò)ssl證書(shū)驗(yàn)證的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • java線(xiàn)程的run()沒(méi)有返回值怎么辦?

    java線(xiàn)程的run()沒(méi)有返回值怎么辦?

    java線(xiàn)程的run()沒(méi)有返回值怎么辦?本文給出了java線(xiàn)程的run()返回值為空的解決辦法,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 解決springboot項(xiàng)目找不到resources目錄下的資源問(wèn)題

    解決springboot項(xiàng)目找不到resources目錄下的資源問(wèn)題

    這篇文章主要介紹了解決springboot項(xiàng)目找不到resources目錄下的資源問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • svn 清理失敗 (cleanup 失敗) 的快速解決方法

    svn 清理失敗 (cleanup 失敗) 的快速解決方法

    下面小編就為大家?guī)?lái)一篇svn 清理失敗 (cleanup 失敗) 的快速解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • Mybatis中的resultType和resultMap使用

    Mybatis中的resultType和resultMap使用

    這篇文章主要介紹了Mybatis中的resultType和resultMap使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • 詳解 Corba開(kāi)發(fā)之Java實(shí)現(xiàn)Service與Client

    詳解 Corba開(kāi)發(fā)之Java實(shí)現(xiàn)Service與Client

    這篇文章主要介紹了詳解 Corba開(kāi)發(fā)之Java實(shí)現(xiàn)Service與Client的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • java最新版本連接mysql失敗的解決過(guò)程

    java最新版本連接mysql失敗的解決過(guò)程

    這篇文章主要給大家介紹了關(guān)于java最新版本連接mysql失敗的解決過(guò)程,文中通過(guò)圖文以及示例代碼將解決的過(guò)程介紹的非常詳細(xì),對(duì)遇到這個(gè)問(wèn)題的同學(xué)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • SpringBoot使用EmbeddedDatabaseBuilder進(jìn)行數(shù)據(jù)庫(kù)集成測(cè)試

    SpringBoot使用EmbeddedDatabaseBuilder進(jìn)行數(shù)據(jù)庫(kù)集成測(cè)試

    在開(kāi)發(fā)SpringBoot應(yīng)用程序時(shí),我們通常需要與數(shù)據(jù)庫(kù)進(jìn)行交互,為了確保我們的應(yīng)用程序在生產(chǎn)環(huán)境中可以正常工作,我們需要進(jìn)行數(shù)據(jù)庫(kù)集成測(cè)試,在本文中,我們將介紹如何使用 SpringBoot 中的 EmbeddedDatabaseBuilder 來(lái)進(jìn)行數(shù)據(jù)庫(kù)集成測(cè)試
    2023-07-07
  • 基于Hibernate中配置文件的學(xué)習(xí)(分享)

    基于Hibernate中配置文件的學(xué)習(xí)(分享)

    下面小編就為大家?guī)?lái)一篇基于Hibernate中配置文件的學(xué)習(xí)(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java字典生成算法講解

    Java字典生成算法講解

    今天小編就為大家分享一篇關(guān)于Java字典生成算法講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02

最新評(píng)論

如皋市| 米脂县| 屏南县| 宜阳县| 崇义县| 永寿县| 九台市| 成安县| 衡水市| 嵩明县| 定安县| 玉门市| 桑植县| 涿州市| 澎湖县| 禹城市| 南汇区| 望谟县| 碌曲县| 巢湖市| 紫金县| 岳阳县| 莱阳市| 井陉县| 读书| 凌云县| 安塞县| 开鲁县| 潜江市| 改则县| 葵青区| 嘉峪关市| 德化县| 济宁市| 安庆市| 宜兰县| 齐齐哈尔市| 开原市| 上思县| 新沂市| 浦县|