SpringBoot 過(guò)濾器 Filter使用實(shí)例詳解
簡(jiǎn)介
過(guò)濾器是AOP(面向切面編程)思想的具體實(shí)現(xiàn)??梢赃^(guò)濾瀏覽器發(fā)出的請(qǐng)求,并且決定放行請(qǐng)求還是中斷請(qǐng)求。
在瀏覽器對(duì)服務(wù)器發(fā)起請(qǐng)求或者服務(wù)器對(duì)瀏覽器響應(yīng),都會(huì)經(jīng)過(guò)過(guò)濾器。
基于過(guò)濾器的機(jī)制,我們可以在過(guò)濾器中對(duì)請(qǐng)求和響應(yīng)做一些處理,可以在過(guò)濾器中決定是否放行,例如:校驗(yàn)請(qǐng)求中有沒(méi)有敏感字符串,校驗(yàn)有沒(méi)有Session,實(shí)現(xiàn)URL級(jí)別的權(quán)限控制、壓縮響應(yīng)信息、編碼格式等。
用法
在spring的應(yīng)用中我們存在兩種過(guò)濾的用法,一種是攔截器、另外一種當(dāng)然是過(guò)濾器。我們這里介紹過(guò)濾器在springboot的用法,在springmvc中的用法基本上一樣,只是配置上面有點(diǎn)區(qū)別。
功能
filter功能,它使用戶可以改變一個(gè) request和修改一個(gè)response. Filter 不是一個(gè)servlet,它不能產(chǎn)生一個(gè)response,它能夠在一個(gè)request到達(dá)servlet之前預(yù)處理request,也可以在離開(kāi) servlet時(shí)處理response.換種說(shuō)法,filter其實(shí)是一個(gè)”servlet chaining”(servlet 鏈).
Filter接口中有一個(gè)doFilter方法,當(dāng)開(kāi)發(fā)人員編寫好Filter類實(shí)現(xiàn)doFilter方法,并配置對(duì)哪個(gè)web資源進(jìn)行攔截后,WEB服務(wù)器每次在調(diào)用web資源的service方法之前(服務(wù)器內(nèi)部對(duì)資源的訪問(wèn)機(jī)制決定的),都會(huì)先調(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("過(guò)濾器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("請(qǐng)求處理");
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("過(guò)濾器銷毀");
}
}
用@WebFilter注解,指定攔截路徑以及一些參數(shù),同時(shí)需要在啟動(dòng)類使用@ServletComponentScan掃描帶@WebFilter、@WebServlet、@WebListener并將幫我們注入bean
@ServletComponentScan
@SpringBootApplication
public class DevRootApplication {
public static void main(String[] args) {
SpringApplication.run(DevRootApplication.class, args);
}
}
當(dāng)有多個(gè)過(guò)濾器之后,就需要規(guī)定各個(gè)過(guò)濾器的指定順序了。
使用@Order()注解
以上就是SpringBoot 過(guò)濾器 Filter使用實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Filter過(guò)濾器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot集成echarts實(shí)現(xiàn)k線圖功能
ECharts是一款基于JavaScript的數(shù)據(jù)可視化圖表庫(kù),提供直觀,生動(dòng),可交互,可個(gè)性化定制的數(shù)據(jù)可視化圖表,本文給大家介紹了SpringBoot集成echarts實(shí)現(xiàn)k線圖功能,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-07-07
java編程之單元測(cè)試(Junit)實(shí)例分析(附實(shí)例源碼)
這篇文章主要介紹了java編程之單元測(cè)試(Junit),結(jié)合實(shí)例形式較為詳細(xì)的分析總結(jié)了Java單元測(cè)試的原理、步驟及相關(guān)注意事項(xiàng),并附帶了完整代碼供讀者下載參考,需要的朋友可以參考下2015-11-11
SpringMVC之簡(jiǎn)單的增刪改查示例(SSM整合)
本篇文章主要介紹了SpringMVC之簡(jiǎn)單的增刪改查示例(SSM整合),這個(gè)例子是基于SpringMVC+Spring+Mybatis實(shí)現(xiàn)的。有興趣的可以了解一下。2017-03-03
SpringCloud Nacos集群搭建過(guò)程詳解
Nacos集群不僅僅是服務(wù)注冊(cè)中心,還在微服務(wù)架構(gòu)中發(fā)揮著關(guān)鍵的角色,支持多種場(chǎng)景下的服務(wù)治理和協(xié)調(diào),本文介紹了如何在SpringCloud環(huán)境中搭建Nacos集群,為讀者提供了一份清晰而詳盡的指南,通過(guò)逐步演示每個(gè)關(guān)鍵步驟,讀者能夠輕松理解并操作整個(gè)搭建過(guò)程2024-02-02
設(shè)計(jì)模式之原型模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了設(shè)計(jì)模式之原型模式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
Nacos1.4.0 Windows10單機(jī)模式啟動(dòng)和集群?jiǎn)?dòng)過(guò)程解析
這篇文章主要介紹了Nacos1.4.0 Windows10單機(jī)模式啟動(dòng)和集群?jiǎn)?dòng),第一次使用nacos,廢話不多說(shuō),記錄下自己?jiǎn)?dòng)Nacos遇到的坑,感興趣的朋友跟隨小編一起看看吧2023-10-10
maven繼承父工程統(tǒng)一版本號(hào)的實(shí)現(xiàn)
這篇文章主要介紹了maven繼承父工程統(tǒng)一版本號(hào)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

