JAVA过滤器以及拦截器的基本介绍以及使用
JAVA過濾器以及攔截器的使用介紹
一 過濾器
1.1 過濾器簡單介紹
JAVA過濾器能夠對目標資源的請求和響應進行截取,對目標資源的請求和響應進行預處理,然后交給下一個過濾器或servlet處理。
通過過濾器進行預處理操作的主要邏輯都是在doFilter()方法中進行實現,這也是需要重點關注的方法,至于init()和destroy()分別是初始化以及銷毀方法。
1.2 自定義過濾器
那么,應該如何自定義過濾器呢?
其實就是這么簡單,如下:
/*** 通過實現 Filter 接口來設置一個過濾器* 通過 @Component 注解使之成為spring的一個Bean* 通過 @WebFilter(urlPatterns = {"/*"}) 設置會進入該過濾器的請求路徑*/ @Component @WebFilter(urlPatterns = {"/common/test", "/common/test01"}) //設置會被過濾處理的路請求徑 @Order(0) //如果存在多個過濾器 設置過濾器的優先級,值越小,優先級越高,doFilter() 越早執行 public class FirstFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("我是第一個過濾器 init~");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("我是第一個過濾器 doFilter~");HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;filterChain.doFilter(request, response);}@Overridepublic void destroy() {System.out.println("我是第一個過濾器 destroy~");}}這里我還設置了第二個過濾器,代碼和第一個過濾器幾乎一樣,除了優先級以及簡單的日志輸出,所以具體代碼我就不重復貼出來了。
1.3 過濾器測試
這個待會兒和下面大的攔截器一起進行測試,便于觀察(我就是懶圖個省事)。
二 攔截器
2.1 攔截器簡單介紹
JAVA里的攔截器是動態攔截Action調用的對象。它提供了一種機制,使開發者可以定義在一個action執行的前后執行的代碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重用部分的方式。
攔截器大部分是基于動態代理實現的,攔截是AOP的一種實現策略。
2.2 自定義攔截器
那么,如何自定義一個攔截器呢?
具體代碼實現如下(基于SpringBoot2.x):
首先自然是實現HandlerInterceptor接口,然后實現相應的方法,具體作用以及介紹注釋有說明:
既然有了第一個攔截器,很顯然,還會有第二個攔截器。為什么要定義多個攔截器呢?其實我的目的是為了展示多個攔截器之間的執行順序。
OK,接下來是第二個攔截器,具體代碼和第一個攔截器幾乎是一樣的,區別就在于沒有做任何攔截處理,直接放行。所以我就不重復貼出來了。
好了,攔截器定義好了還不夠,還需要將其進行注冊,接下來便是注冊部分:
/*** 該配置類用于注冊攔截器*/ @Configuration public class WebConfig implements WebMvcConfigurer {@Autowiredprivate FirstInterceptor firstInterceptor;@Autowiredprivate SecondInterceptor secondInterceptor;/*** 攔截器注冊 可注冊多個 執行順序和注冊順序一樣** @param registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {//攔截器的執行順序取決與注冊順序registry.addInterceptor(firstInterceptor)//設置會被該攔截器攔截的請求路徑 /** 表示所有.addPathPatterns("/**");registry.addInterceptor(secondInterceptor).addPathPatterns("/**")//設置該攔截器不會攔截的請求路徑.excludePathPatterns("/common/test01");}}2.3 攔截器+過濾器測試
具體控制器層測代碼如下:
@RestController public class TestController {@GetMapping("/common/test")public void test() {System.out.println("我是test");}@GetMapping("/common/test01")public void test01() {System.out.println("我是test01");}}OK,讓我們請求 /common/test 接口,看看會有什么效果
執行順簡單總結一下:
- 可以看到,因為設置了第一個過濾器的優先級高于第二個過濾器,所以第一個過濾器優先執行。
- 過濾器是優先于攔截器執行的。
- 攔截器的執行順序取決于注冊順序,也就是代碼里的注冊順序。
- 第一個攔截器并不是所有方法都是優先執行的,僅有preHandle()方法是優先執行的。
三 二者對比
- 過濾器是基于函數回調的,而攔截器則是基于Java反射的。
- 過濾器依賴于servlet容器,攔截器不依賴于servlet容器。
- 過濾器幾乎對所有的請求起作用,l攔截器只能對action請求起作用。
- 攔截器可以訪問Action的上下文,值棧里的對象,而過濾器不能。
- 在Action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
一般攔截器用來做一些接口簽名或者參數校驗之類的,當然也可以做日志處理。功能比過濾器更加強大,也更加靈活。
總結
以上是生活随笔為你收集整理的JAVA过滤器以及拦截器的基本介绍以及使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最小二乘法的嵌入式C语言实现
- 下一篇: 怎么避开代还系统开发的套路?