專車介紹
該趟專車是開往SpringBoot自定義Filter的實戰專車,我們都知道Filter可以幫助完成許多統一的業務處理功能,比如:打印web請求日誌、記錄web請求耗時、請求鑑權等等;還可以實現資源初始化、資源釋放功能。如此可以看出Filter在web開發中的地位,該篇文章將通過多種方式來實現Filter的定義,讓大家充分掌握此利器。
專車問題
SpringBoot可以通過幾種方式來定義Filter?
專車實戰
第一步:在父模塊下面新建一個名為boot-example-filter的子模塊
第二步:子模塊添加如下依賴
<code><
dependencies
><
dependency
><
groupId
>org.springframework.bootgroupId
><
artifactId
>spring-boot-starter-webartifactId
>dependency
><
dependency
><
groupId
>org.projectlombokgroupId
><
artifactId
>lombokartifactId
>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> 4jpublic
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
FilterRegistrationBeanfilterRegistrationBean
()
{ 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註解,比較麻煩