SpringBoot2.0 實戰專車系列五:自定義過濾器

SpringBoot2.0 實戰專車系列五:自定義過濾器

專車介紹

該趟專車是開往SpringBoot自定義Filter的實戰專車,我們都知道Filter可以幫助完成許多統一的業務處理功能,比如:打印web請求日誌、記錄web請求耗時、請求鑑權等等;還可以實現資源初始化、資源釋放功能。如此可以看出Filter在web開發中的地位,該篇文章將通過多種方式來實現Filter的定義,讓大家充分掌握此利器。

專車問題

SpringBoot可以通過幾種方式來定義Filter?

專車實戰

第一步:在父模塊下面新建一個名為boot-example-filter的子模塊

第二步:子模塊添加如下依賴

<code>

<

dependencies

>

<

dependency

>

<

groupId

>

org.springframework.boot

groupId

>

<

artifactId

>

spring-boot-starter-web

artifactId

>

dependency

>

<

dependency

>

<

groupId

>

org.projectlombok

groupId

>

<

artifactId

>

lombok

artifactId

>

dependency

>

dependencies

>

/<code>

第三步:創建filter

第一種實現方式:使用@Component註解標註

<code>

@Component

@Order

(

1

)

@Slf4j

public class CustomFilter1 implements Filter {

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

log

.info

(

"執行被@Component標註的CustomFilter1的doFilter方法"

);

filterChain

.doFilter

(servletRequest, servletResponse); } @

Override

public

void

init

(FilterConfig filterConfig)

throws

ServletException

{

log

.info

(

"執行被@Component標註的CustomFilter1的init方法"

); } @

Override

public

void

destroy

() {

log

.info

(

"執行被@Component標註的CustomFilter1的destroy方法"

); } }/<code>

第二種實現方式:使用FilterRegistrationBean進行註冊

<code> 4j

public

class

CustomFilter2

implements

Filter

{

public

void

doFilter

(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)

throws

IOException, ServletException

{ log.info(

"執行被CustomFilter2的doFilter方法"

); filterChain.doFilter(servletRequest, servletResponse); }

public

void

init

(FilterConfig filterConfig)

throws

ServletException

{ log.info(

"執行CustomFilter2的init方法"

); }

public

void

destroy

()

{ log.info(

"執行CustomFilter2的destroy方法"

); } }

public

class

WebFilterConfiguration

{

public

FilterRegistrationBean

filterRegistrationBean

()

{ FilterRegistrationBean filterRegistrationBean =

new

FilterRegistrationBean(); filterRegistrationBean.setFilter(

new

CustomFilter2()); filterRegistrationBean.addUrlPatterns(

"/*"

); filterRegistrationBean.setOrder(

2

);

return

filterRegistrationBean; } }/<code>

第三種實現方式:使用Servlet提供的註解@WebFilter來定義Filter,該種實現方式需要在啟動類上添加@ServletComponentScan註解

<code>

@Slf4j

@WebFilter

(filterName =

"customFilter3"

, urlPatterns =

"/*"

)

@Order

(

3

) public class CustomFilter3 implements Filter {

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

log

.info

(

"執行被CustomFilter3的doFilter方法"

);

filterChain

.doFilter

(servletRequest, servletResponse); } @

Override

public

void

init

(FilterConfig filterConfig)

throws

ServletException

{

log

.info

(

"執行被CustomFilter3的init方法"

); } @

Override

public

void

destroy

() {

log

.info

(

"執行被CustomFilter3的destroy方法"

); } }/<code>

第四步:創建啟動類

<code>

@SpringBootApplication

@ServletComponentScan

public class FilterApplication {

public

static

void

main

(String[] args) {

SpringApplication

.run

(FilterApplication.class); } }/<code>

第五步:啟動應用,查看日誌

<code>執行CustomFilter2的

init

方法 執行被 標註的CustomFilter1的

init

方法 執行CustomFilter3的

init

方法/<code>

第六步:訪問應用

<code>執行被@Component標註的CustomFilter1的doFilter方法
執行CustomFilter2的doFilter方法
執行CustomFilter3的doFilter方法/<code>

第七步:關閉應用

<code>執行CustomFilter2的destroy方法
執行被@Component標註的CustomFilter1的destroy方法
執行CustomFilter3的destroy方法/<code>

如上通過啟動應用來執行Filter的初始化方法、發送web請求來指定Filter的doFilter方法、停止應用來執行Filter的銷燬方法

專車總結

在SpringBoot中可以通過三種方式來定義Filter:

第一種:實現Filter接口並使用@Compnent註解標註,此種方式只能過濾/*這種路徑,不能過濾特定路徑

第二種:實現Filter接口並使用FilterRegistrationBean進行註冊,此種方式可以更靈活定義需要過濾的路徑形式(推薦使用該方式)

第三種:實現Filter接口,使用@WebFilter標註,並且需要在啟動類中添加@ServletComponentScan註解,比較麻煩


分享到:


相關文章: