成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:過濾器和攔截器有什么區別?

開發 前端
過濾器和攔截器都是基于 AOP 思想實現的,用來處理某個統一的功能的,但二者又有 5 點不同:出身不同、觸發時機不同、實現不同、支持的項目類型不同以及使用的場景不同。過濾器通常是用來進行全局過濾的,而攔截器是用來實現某項業務攔截的。

過濾器(Filter)和攔截器(Interceptor)都是基于 AOP(Aspect Oriented Programming,面向切面編程)思想實現的,用來解決項目中某一類問題的兩種“工具”,但二者有著明顯的差距,接下來我們一起來看。

實現過濾器和攔截器

首先,我們先來看一下二者在 Spring Boot 項目中的具體實現,這對后續理解二者的區別有很大的幫助。

1、實現過濾器

過濾器可以使用 Servlet 3.0 提供的 @WebFilter 注解,配置過濾的 URL 規則,然后再實現 Filter 接口,重寫接口中的 doFilter 方法,具體實現代碼如下:

import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@Component
@WebFilter(urlPatterns = "/*")
public class TestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("過濾器:執行 init 方法。");
}
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("過濾器:開始執行 doFilter 方法。");
// 請求放行
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("過濾器:結束執行 doFilter 方法。");
}
@Override
public void destroy() {
System.out.println("過濾器:執行 destroy 方法。");
}
}

其中:

  • void init(FilterConfig filterConfig):容器啟動(初始化 Filter)時會被調用,整個程序運行期只會被調用一次。用于實現 Filter 對象的初始化。
  • void doFilter(ServletRequest request, ServletResponse response,FilterChain chain):具體的過濾功能實現代碼,通過此方法對請求進行過濾處理,其中 FilterChain 參數是用來調用下一個過濾器或執行下一個流程
  • void destroy():用于 Filter 銷毀前完成相關資源的回收工作。

2、實現攔截器

攔截器的實現分為兩步,第一步,創建一個普通的攔截器,實現 HandlerInterceptor 接口,并重寫接口中的相關方法;第二步,將上一步創建的攔截器加入到 Spring Boot 的配置文件中。接下來,先創建一個普通攔截器,實現 HandlerInterceptor 接口并重寫 preHandle/postHandle/afterCompletion 方法,具體實現代碼如下:

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class TestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("攔截器:執行 preHandle 方法。");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("攔截器:執行 postHandle 方法。");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("攔截器:執行 afterCompletion 方法。");
}
}

其中:

  • boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handle):在請求方法執行前被調用,也就是調用目標方法之前被調用。比如我們在操作數據之前先要驗證用戶的登錄信息,就可以在此方法中實現,如果驗證成功則返回 true,繼續執行數據操作業務;否則就返回 false,后續操作數據的業務就不會被執行了。
  • void postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView):調用請求方法之后執行,但它會在 DispatcherServlet 進行渲染視圖之前被執行。
  • void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex):會在整個請求結束之后再執行,也就是在 DispatcherServlet 渲染了對應的視圖之后再執行。

最后,我們再將上面的攔截器注入到項目配置文件中,并設置相應攔截規則,具體實現代碼如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class AppConfig implements WebMvcConfigurer {

// 注入攔截器
@Autowired
private TestInterceptor testInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(testInterceptor) // 添加攔截器
.addPathPatterns("/*"); // 攔截所有地址
}
}

了解了二者的使用之后,接下來我們來看二者的區別。

過濾器 VS 攔截器

過濾器和攔截器的區別主要體現在以下 5 點:

  1. 出身不同;
  2. 觸發時機不同;
  3. 實現不同;
  4. 支持的項目類型不同;
  5. 使用的場景不同。

接下來,我們一一來看。

1、出身不同

過濾器來自于 Servlet,而攔截器來自于 Spring 框架,從上面代碼中我們也可以看出,過濾器在實現時導入的是 Servlet 相關的包,如下圖所示:

圖片

而攔截器在實現時,導入的是 Spring 相關的包,如下圖所示:

圖片

2、觸發時機不同

請求的執行順序是:請求進入容器 > 進入過濾器 > 進入 Servlet > 進入攔截器 > 執行控制器(Controller),如下圖所示:

圖片

所以過濾器和攔截器的執行時機也是不同的,過濾器會先執行,然后才會執行攔截器,最后才會進入真正的要調用的方法。

3、實現不同

過濾器是基于方法回調實現的,我們在上面實現過濾器的時候就會發現,當我們要執行下一個過濾器或下一個流程時,需要調用 FilterChain 對象的 doFilter 方法進行回調執行,如下圖所示:

圖片

由此可以看出,過濾器的實現是基于方法回調的。而攔截器是基于動態代理(底層是反射)實現的,它的實現如下圖所示:

圖片

代理調用的效果如下圖所示:

圖片

4、支持的項目類型不同

過濾器是 Servlet 規范中定義的,所以過濾器要依賴 Servlet 容器,它只能用在 Web 項目中;而攔截器是 Spring 中的一個組件,因此攔截器既可以用在 Web 項目中,同時還可以用在 Application 或 Swing 程序中。

5、使用的場景不同

因為攔截器更接近業務系統,所以攔截器主要用來實現項目中的業務判斷的,比如:登錄判斷、權限判斷、日志記錄等業務。而過濾器通常是用來實現通用功能過濾的,比如:敏感詞過濾、字符集編碼設置、響應數據壓縮等功能。

本文項目源碼下載

https://gitee.com/mydb/springboot-examples/tree/master/spring-boot-filter

總結

過濾器和攔截器都是基于 AOP 思想實現的,用來處理某個統一的功能的,但二者又有 5 點不同:出身不同、觸發時機不同、實現不同、支持的項目類型不同以及使用的場景不同。過濾器通常是用來進行全局過濾的,而攔截器是用來實現某項業務攔截的。

參考 & 鳴謝

  • blog.csdn.net/wo541075754/article/details/111661213
  • zhuanlan.zhihu.com/p/340397290
責任編輯:姜華 來源: Java面試真題解析
相關推薦

2020-09-14 12:46:25

過濾器攔截器Filter

2023-05-29 07:36:04

Java過濾器攔截器

2024-02-01 08:08:53

Spring過濾器類型Gateway

2022-01-13 10:04:21

攔截器Interceptor過濾器

2023-02-17 08:10:24

2024-04-03 15:33:04

JWTSession傳輸信息

2024-09-19 08:42:43

2023-09-15 11:26:16

2021-12-10 12:01:37

finalfinallyfinalize

2021-11-30 07:44:50

FinalFinallyFinalize

2021-12-13 06:56:45

Comparable元素排序

2024-03-20 15:12:59

KafkaES中間件

2021-12-23 07:11:31

開發

2024-01-17 08:56:31

2024-09-25 17:44:08

2023-02-09 07:01:35

轉發重定向Java

2023-07-11 08:40:02

IO模型后臺

2023-12-13 13:31:00

useEffect對象瀏覽器

2022-05-16 11:04:43

RocketMQPUSH 模式PULL 模式

2024-03-26 16:24:46

分布式事務2PC3PC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天操夜夜爽 | 欧美综合视频在线 | 这里精品 | 久久精品欧美一区二区三区不卡 | 日韩一级在线 | 日本在线免费观看 | 蜜桃av鲁一鲁一鲁一鲁 | 亚洲毛片 | 欧美一卡二卡在线观看 | 国产日韩欧美另类 | 大陆一级毛片免费视频观看 | 久久亚洲一区二区三区四区 | 精久久 | 亚洲人人 | 国产成人精品一区二区三区四区 | 99re国产精品 | 亚洲精品久久久久久国产精华液 | 五月婷婷色 | 成人亚洲片 | 久久久一区二区三区四区 | 日韩中文字幕在线观看视频 | 久热精品在线观看视频 | 中文字幕在线第二页 | 每日在线更新av | 日韩精品专区在线影院重磅 | 国产成人综合一区二区三区 | 亚洲欧美在线视频 | 欧美成人免费在线 | 欧美日韩在线一区二区 | 91精品国产91久久久久久最新 | 日韩欧美在线视频 | 亚州精品天堂中文字幕 | 亚洲精品一区二区 | 日韩电影中文字幕 | www.久| 欧美黄色一区 | 国产高清精品一区二区三区 | 国产精品一二三区 | 中文字幕精品一区久久久久 | 亚洲一区二区视频 | 日本不卡在线观看 |