Filter在springboot中的使用方法詳解
Filter 過(guò)濾器
Filter何時(shí)進(jìn)行url過(guò)濾
filter(過(guò)濾器)作用于在intreceptor(攔截器)之前,不像intreceptor一樣依賴于springmvc框架,只需要依賴于serverlet。
Filter在spring /springboot中如何使用
1.自定義Filter
比較原始的一種方法是定義一個(gè)MyFilter實(shí)現(xiàn)javax.servlet.Filter接口
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 對(duì)request或 response 進(jìn)行處理
// 調(diào)用filter鏈中的下一個(gè)filter
filterChain.doFilter(servletRequest,servletResponse);
}
}另一種方法的自定義Filter,繼承springframework.web.filter.OncePerRequestFilter,可以對(duì)同一個(gè)請(qǐng)求,只經(jīng)過(guò)一次過(guò)濾
public class MyFilter extends OncePerRequestFilter {
/**此處不能@override doFilter方法
* 因?yàn)镺ncePerRequestFilter中 doFilter方法已經(jīng)是final
*
*/
//自定義處理方法
public void interrupt(HttpServletResponse response, ErrorCode code){
//此處對(duì)response進(jìn)行處理
}
//重載OnecePerRequestFilter方法
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain){
//調(diào)用自定義處理方法
interrupt(response,code);
//對(duì)request 、response進(jìn)行處理
}
}OncePerRequestFilter中的方法
| 修飾符和類型 | 方法和描述 |
| void | doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) 此doFilter實(shí)現(xiàn)存儲(chǔ)“已過(guò)濾”的請(qǐng)求屬性,如果屬性已經(jīng)存在,則繼續(xù)進(jìn)行而不再過(guò)濾。 |
| protected abstract void | doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)和doFilter相同功能,但保證在單個(gè)請(qǐng)求線程中每個(gè)請(qǐng)求只調(diào)用一次。 |
| protected java.lang.String | getAlreadyFilteredAttributeName() 返回標(biāo)識(shí)已過(guò)濾請(qǐng)求的請(qǐng)求屬性的名稱。 |
| protected boolean | isAsyncDispatch(HttpServletRequest request) javax.servlet.DispatcherType.ASYNCServlet 3.0中引入的調(diào)度程序類型意味著可以在單個(gè)請(qǐng)求的過(guò)程中在多個(gè)線程中調(diào)用過(guò)濾器。 |
| protected boolean | isAsyncStarted(HttpServletRequest request) 請(qǐng)求處理是否處于異步模式,這意味著在退出當(dāng)前線程后不會(huì)提交響應(yīng) |
| protected boolean | shouldNotFilter(HttpServletRequest request) 可以在子類中重寫(xiě)以進(jìn)行自定義篩選控制,返回true以避免過(guò)濾給定的請(qǐng)求。 |
| protected boolean | shouldNotFilterAsyncDispatch() javax.servlet.DispatcherType.ASYNCServlet 3.0中引入的調(diào)度程序類型意味著可以在單個(gè)請(qǐng)求的過(guò)程中在多個(gè)線程中調(diào)用過(guò)濾器。 |
| protected boolean | shouldNotFilterErrorDispatch() 是否過(guò)濾錯(cuò)誤調(diào)度,例如servlet容器處理和映射錯(cuò)誤時(shí)web.xml |
2.注冊(cè)自定義Filter
在springboot中可以寫(xiě)一個(gè)配置類,使用@Bean注入myFilterBean
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
@Configuration
public class MyFilterConfig {
@Bean
public FilterRegistrationBean myFilterBean(MyFilter filter) {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(filter);//設(shè)置為自定義的過(guò)濾器MyFilter
filterRegistrationBean.addUrlPatterns("/*");//攔截所有請(qǐng)求
filterRegistrationBean.setOrder(1);//優(yōu)先級(jí)為1
return filterRegistrationBean;
}
//可注冊(cè)多個(gè)自定義的過(guò)濾器
}如果是使用xml配置則在web.xml配置如下( 注意配置多個(gè)filter時(shí)優(yōu)先級(jí)由filter的配置順序決定優(yōu)先級(jí))
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.text.filter.myFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>到此這篇關(guān)于Filter在springboot中的使用方法詳解的文章就介紹到這了,更多相關(guān)Filter使用方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文詳解Springboot中filter的原理與注冊(cè)
- SpringBoot注冊(cè)FilterRegistrationBean相關(guān)情況講解
- Springboot?中的?Filter?實(shí)現(xiàn)超大響應(yīng)?JSON?數(shù)據(jù)壓縮的方法
- SpringBoot 過(guò)濾器 Filter使用實(shí)例詳解
- SpringBoot項(xiàng)目找不到j(luò)avax.servlet.Filter的問(wèn)題及解決
- Springboot使用filter對(duì)response內(nèi)容進(jìn)行加密方式
- Springboot如何使用filter對(duì)request body參數(shù)進(jìn)行校驗(yàn)
相關(guān)文章
IDEA POJO開(kāi)發(fā)神器之Groovy的使用詳解
這篇文章主要介紹了IDEA POJO開(kāi)發(fā)神器之Groovy的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
解讀springboot配置mybatis的sql執(zhí)行超時(shí)時(shí)間(mysql)
這篇文章主要介紹了解讀springboot配置mybatis的sql執(zhí)行超時(shí)時(shí)間(mysql),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
Java HelloWorld原理分析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
我們初學(xué)java的第一個(gè)程序是"hello world"。下面通過(guò)實(shí)例代碼給大家講解Java HelloWorld原理分析,感興趣的朋友一起學(xué)習(xí)吧2017-05-05
基于mybatis高級(jí)映射多對(duì)多查詢的實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇基于mybatis高級(jí)映射多對(duì)多查詢的實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
快速解決idea @Autowired報(bào)紅線問(wèn)題
這篇文章主要介紹了快速解決idea @Autowired報(bào)紅線問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Java concurrency之鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java concurrency之鎖的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Java單表實(shí)現(xiàn)評(píng)論回復(fù)功能(多種實(shí)現(xiàn)方式)
這篇文章主要介紹了Java單表實(shí)現(xiàn)評(píng)論回復(fù)功能,大家都知道評(píng)論功能有多種實(shí)現(xiàn)方式,本文逐一給大家詳細(xì)講解,需要的朋友可以參考下2023-03-03
Spring實(shí)現(xiàn)控制反轉(zhuǎn)和依賴注入的示例詳解
這篇文章主要為大家詳細(xì)介紹IoC(控制反轉(zhuǎn))和DI(依賴注入)的概念,以及如何在Spring框架中實(shí)現(xiàn)它們,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-08-08

