SpringBoot 過濾器 Filter使用實(shí)例詳解
簡介
過濾器是AOP(面向切面編程)思想的具體實(shí)現(xiàn)??梢赃^濾瀏覽器發(fā)出的請求,并且決定放行請求還是中斷請求。
在瀏覽器對服務(wù)器發(fā)起請求或者服務(wù)器對瀏覽器響應(yīng),都會經(jīng)過過濾器。
基于過濾器的機(jī)制,我們可以在過濾器中對請求和響應(yīng)做一些處理,可以在過濾器中決定是否放行,例如:校驗(yàn)請求中有沒有敏感字符串,校驗(yàn)有沒有Session,實(shí)現(xiàn)URL級別的權(quán)限控制、壓縮響應(yīng)信息、編碼格式等。
用法
在spring的應(yīng)用中我們存在兩種過濾的用法,一種是攔截器、另外一種當(dāng)然是過濾器。我們這里介紹過濾器在springboot的用法,在springmvc中的用法基本上一樣,只是配置上面有點(diǎn)區(qū)別。
功能
filter功能,它使用戶可以改變一個 request和修改一個response. Filter 不是一個servlet,它不能產(chǎn)生一個response,它能夠在一個request到達(dá)servlet之前預(yù)處理request,也可以在離開 servlet時處理response.換種說法,filter其實(shí)是一個”servlet chaining”(servlet 鏈).
Filter接口中有一個doFilter方法,當(dāng)開發(fā)人員編寫好Filter類實(shí)現(xiàn)doFilter方法,并配置對哪個web資源進(jìn)行攔截后,WEB服務(wù)器每次在調(diào)用web資源的service方法之前(服務(wù)器內(nèi)部對資源的訪問機(jī)制決定的),都會先調(diào)用一下filter的doFilter方法。
實(shí)現(xiàn)
Filter的執(zhí)行由Servlet容器回調(diào)完成,因此我們不需要再額外引包。
新建MyFilter類
@Slf4j
@Order(1)
@WebFilter(filterName = "myFilter", urlPatterns = {"/user/*"})
public class MyFilter implements Filter {
@Autowired
private SysUserService sysUserService;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("過濾器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("請求處理");
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
log.info("MyFilter, URL:{}", request.getRequestURI());
if (request.getRequestURI().contains("login")) {
filterChain.doFilter(servletRequest, servletResponse);
} else {
log.info("非法URL:{}", request.getRequestURI());
response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
PrintWriter writer = response.getWriter();
writer.print("no access");
}
}
@Override
public void destroy() {
log.info("過濾器銷毀");
}
}
用@WebFilter注解,指定攔截路徑以及一些參數(shù),同時需要在啟動類使用@ServletComponentScan掃描帶@WebFilter、@WebServlet、@WebListener并將幫我們注入bean
@ServletComponentScan
@SpringBootApplication
public class DevRootApplication {
public static void main(String[] args) {
SpringApplication.run(DevRootApplication.class, args);
}
}
當(dāng)有多個過濾器之后,就需要規(guī)定各個過濾器的指定順序了。
使用@Order()注解
以上就是SpringBoot 過濾器 Filter使用實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Filter過濾器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot集成echarts實(shí)現(xiàn)k線圖功能
ECharts是一款基于JavaScript的數(shù)據(jù)可視化圖表庫,提供直觀,生動,可交互,可個性化定制的數(shù)據(jù)可視化圖表,本文給大家介紹了SpringBoot集成echarts實(shí)現(xiàn)k線圖功能,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-07-07
java編程之單元測試(Junit)實(shí)例分析(附實(shí)例源碼)
這篇文章主要介紹了java編程之單元測試(Junit),結(jié)合實(shí)例形式較為詳細(xì)的分析總結(jié)了Java單元測試的原理、步驟及相關(guān)注意事項,并附帶了完整代碼供讀者下載參考,需要的朋友可以參考下2015-11-11
設(shè)計模式之原型模式_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了設(shè)計模式之原型模式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
Nacos1.4.0 Windows10單機(jī)模式啟動和集群啟動過程解析
這篇文章主要介紹了Nacos1.4.0 Windows10單機(jī)模式啟動和集群啟動,第一次使用nacos,廢話不多說,記錄下自己啟動Nacos遇到的坑,感興趣的朋友跟隨小編一起看看吧2023-10-10
maven繼承父工程統(tǒng)一版本號的實(shí)現(xiàn)
這篇文章主要介紹了maven繼承父工程統(tǒng)一版本號的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

