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,也可以在離開 servlet時(shí)處理response.換種說(shuō)法,filter其實(shí)是一個(gè)”servlet chaining”(servlet 鏈).
Filter接口中有一個(gè)doFilter方法,當(dāng)開發(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整合Hibernate Validator實(shí)現(xiàn)參數(shù)驗(yàn)證功能
這篇文章主要介紹了SpringBoot整合Hibernate Validator實(shí)現(xiàn)參數(shù)驗(yàn)證功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06詳解Java中的println輸入和toString方法的重寫問(wèn)題
這篇文章主要介紹了Java中的println輸入和toString方法的重寫,一個(gè)對(duì)象數(shù)組在調(diào)用Arrays.toString打印時(shí),相當(dāng)于遍歷數(shù)組,然后打印里邊每個(gè)對(duì)象,這再打印對(duì)象就調(diào)用對(duì)象自己的toString了,需要的朋友可以參考下2022-04-04使用ShardingSphere-Proxy實(shí)現(xiàn)分表分庫(kù)
這篇文章介紹了使用ShardingSphere-Proxy實(shí)現(xiàn)分表分庫(kù)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02sentinel配置 持久化到nacos的詳細(xì)過(guò)程
這篇文章主要介紹了sentinel配置 持久化到nacos的詳細(xì)過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-08-08詳解Java使用Jsch與sftp服務(wù)器實(shí)現(xiàn)ssh免密登錄
這篇文章主要介紹了詳解Java使用Jsch與sftp服務(wù)器實(shí)現(xiàn)ssh免密登錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10