springboot三種過濾功能的使用與比較

若要實現對請求的過濾,有三種方式可供選擇:filter、interceptort和aop。本文主要討論三種攔截器的使用場景與使用方式。

下文中的舉例功能是計算每個請求的從開始到結束的時間,例子來源是慕課網。

一、filter

特點:可以獲取原始的ServletRequest,但無法獲取具體方法

實現:

1.繼承javax.servlet.Filter類,

2.@Component注解將其注入到框架中

3.實現其中的dofilter方法,所有的請求都會經過該方法,可以在此計算出每個請求的耗時,代碼如下:

 1 package com.zzy.web.filter;
 2 
 3 import java.io.IOException;
 4 import java.util.Date;
 5 
 6 import javax.servlet.Filter;
 7 import javax.servlet.FilterChain;
 8 import javax.servlet.FilterConfig;
 9 import javax.servlet.ServletException;
10 import javax.servlet.ServletRequest;
11 import javax.servlet.ServletResponse;
12 
13 import org.springframework.stereotype.Component;
14 
15 @Component
16 public class TimeFilter implements Filter{
17 
18     @Override
19     public void init(FilterConfig filterConfig) throws ServletException {
20         // TODO Auto-generated method stub
21         System.out.println("filter init");
22         
23     }
24 
25     @Override
26     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
27             throws IOException, ServletException {
28         // TODO Auto-generated method stub
29         Long startTime = new Date().getTime();
30         System.out.println("filter 請求開始時間:"+ startTime);
31         chain.doFilter(request, response);
32          Long endTime = new Date().getTime();
33         System.out.println("filter 請求結束時間:" + endTime +",請求耗時:" + (endTime - startTime));
34         
35     }
36 
37     @Override
38     public void destroy() {
39         // TODO Auto-generated method stub
40         
41     }
42 
43 }

注:如果有的框架沒有@Component 這個注解,可以自己寫一個配置類,在該類中指定過濾器,而且還可以指定過濾的url,配置類如下:

 1 package com.zzy.web.config;
 2 
 3 import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
 4 
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.boot.web.servlet.FilterRegistrationBean;
10 import org.springframework.context.annotation.Bean;
11 import org.springframework.context.annotation.Configuration;
12 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
13 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
14 
15 import com.zzy.web.filter.TimeFilter;
16 import com.zzy.web.interceptor.TimeInterceptor;
17 
18 @Configuration
19 public class WebConfig extends WebMvcConfigurerAdapter {
20     
21     @Autowired
22     private TimeInterceptor timeInterceptor;
23     
24 //    @Override
25 //    public void addInterceptors(InterceptorRegistry registry) {
26 //        // TODO Auto-generated method stub
27 //        registry.addInterceptor(timeInterceptor);
28 //    }
29     
30     @Bean
31     public FilterRegistrationBean timeFilter() {
32         FilterRegistrationBean registrationBean = new FilterRegistrationBean();
33         TimeFilter timeFilter = new TimeFilter();
34         registrationBean.setFilter(timeFilter);
35         List<String> urls = new ArrayList<>();
36         urls.add("/user/*");
37         registrationBean.setUrlPatterns(urls);
38         return registrationBean;
39     }
40 
41 }

?

?

二、interceptor

特點:可以獲取到原始的request和請求的方法,但無法獲取方法的具體參數的值。

實現:

1.繼承HandlerInterceptor接口

2.請求前的邏輯寫在prehandle(請求前調用)

3.請求后的邏輯寫在posthandle(請求成功后調用,失敗則不調用)

4.請求后,不管成功失敗都會調用aftercompletion。

5.intceptor方式繼承了之后還沒起作用,還需要在配置類里面加一下,把剛聲明的攔截器注冊一下。

代碼示例:

 1 package com.zzy.web.interceptor;
 2 
 3 import java.util.Arrays;
 4 import java.util.Date;
 5 
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 
 9 import org.springframework.stereotype.Component;
10 import org.springframework.web.method.HandlerMethod;
11 import org.springframework.web.servlet.HandlerInterceptor;
12 import org.springframework.web.servlet.ModelAndView;
13 @Component
14 public class TimeInterceptor implements HandlerInterceptor {
15 
16     @Override
17     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
18             throws Exception {
19         // TODO Auto-generated method stub
20         System.out.println("interceptor 執行preHandle");
21 
22         request.setAttribute("startTime", new Date().getTime());
23         return true;
24     }
25 
26     @Override
27     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
28             ModelAndView modelAndView) throws Exception {
29         // TODO Auto-generated method stub
30         Long startTime = Long.parseLong(request.getAttribute("startTime").toString());
31         Long endTime = new Date().getTime();
32         System.out.println("interceptor 執行postHandle");
33         System.out.println("interceptor 請求類:"+((HandlerMethod)handler).getBean().getClass().getName());
34         System.out.println("interceptor 請求方法:"+((HandlerMethod)handler).getMethod());
35 //        System.out.println("interceptor 請求參數:");
36 //        Arrays.asList(((HandlerMethod)handler).getMethodParameters()).stream().forEach(arg->System.out.println(arg));
37         System.out.println("interceptor 請求耗時:" + (endTime - startTime));
38 
39     }
40 
41     @Override
42     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
43             throws Exception {
44         // TODO Auto-generated method stub
45         Long startTime = Long.parseLong(request.getAttribute("startTime").toString());
46         Long endTime = new Date().getTime();
47         System.out.println("interceptor 執行afterCompletion");
48         System.out.println("interceptor 請求類:"+((HandlerMethod)handler).getBean().getClass().getName());
49         System.out.println("interceptor 請求方法:"+((HandlerMethod)handler).getMethod());
50         System.out.println("interceptor 請求耗時:" + (endTime - startTime));
51         System.out.println("interceptor 請求異常:" + ex);
52 
53     }
54 
55 }

配置類如下:

 1 package com.zzy.web.config;
 2 
 3 import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
 4 
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.boot.web.servlet.FilterRegistrationBean;
10 import org.springframework.context.annotation.Bean;
11 import org.springframework.context.annotation.Configuration;
12 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
13 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
14 
15 import com.zzy.web.filter.TimeFilter;
16 import com.zzy.web.interceptor.TimeInterceptor;
17 
18 @Configuration
19 public class WebConfig extends WebMvcConfigurerAdapter {
20     
21     @Autowired
22     private TimeInterceptor timeInterceptor;
23     
24     @Override
25     public void addInterceptors(InterceptorRegistry registry) {
26         // TODO Auto-generated method stub
27         registry.addInterceptor(timeInterceptor);
28     }
29 
30 
31 }

?

三、aop

特點:能拿到方法和具體參數的值,但是拿不到原始的servletrequest的信息。

實現:

1.使用@aspect注解

2.@execution聲明切面,聲明切面的語法可參考官網https://docs.spring.io/spring/docs/4.3.18.RELEASE/spring-framework-reference/htmlsingle/#aop-pointcuts

3.使用@Around(方法前和方法后),@Before(方法前)或@After(方法后)

以下為@Around舉例,代碼如下:

 1 package com.zzy.web.aspect;
 2 
 3 import java.util.Date;
 4 
 5 import org.aspectj.lang.ProceedingJoinPoint;
 6 import org.aspectj.lang.annotation.Around;
 7 import org.aspectj.lang.annotation.Aspect;
 8 import org.codehaus.jackson.map.ObjectMapper;
 9 import org.springframework.stereotype.Component;
10 
11 @Aspect
12 @Component
13 public class TimeAspect {
14 
15     @Around("execution(* com.zzy.web.controller.UserController.*(..))")
16     public Object test(ProceedingJoinPoint pjp) throws Throwable {
17         Long startTime = new Date().getTime();
18         Object[] args = pjp.getArgs();
19         for (Object arg : args) {
20             System.out.println("aspect 參數:" + arg);
21         }
22         Object object = pjp.proceed();
23         System.out.println("aspect 請求耗時:" + (new Date().getTime() - startTime));
24         System.out.println("aspect 請求結果:" + new ObjectMapper().writeValueAsString(object));
25 
26         return object;
27 
28     }
29 }

?下圖是三種方式的攔截順序,圖片來自慕課網:

?

?

?

轉載于:https://www.cnblogs.com/zuxiaoyuan/p/9702363.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279281.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279281.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279281.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

后綴的形容詞_構詞法(18)構成形容詞的常見后綴 3

即時練習一、按要求改寫下列單詞。1. Japan →___________ adj. 日本(人)的2. Canton →_________ adj. 廣東(人)的3. Vietnam →__________ adj. 越南(人)的4. Europe →__________ adj. 歐洲(人)的5. India → ________ adj. 印度(人)的6. Africa →_______ adj. 非洲(人)的7…

CentOS 桌面啟動無登錄界面

最近VMWare下搞了2個CentOS 32bit虛擬機, 裝了些軟件之后&#xff0c;都遇到開機無法顯示登錄界面&#xff0c; 僅能看見桌面背景圖的情況。 以下是我搜索很久匯總的方法。 嘗試按 ctrl alt F3(快捷鍵可能有所不同), 由桌面模式進入命令行模式。 直接 startx 報錯&#xf…

批量刪除推文_如何搜索(和刪除)您的舊推文

批量刪除推文“The internet never forgets” is an aphorism that isn’t entirely true, but it’s worth thinking about whenever you post to social media. If you think your Twitter profile needs a bit of a scrub, here’s how to search and delete those old twee…

[USACO13JAN] Cow Lineup (單調隊列,尺取法)

題目鏈接 Solution 尺取法板子,算是復習一波. 題中說最多刪除 \(k\) 種,那么其實就是找一個顏色種類最多為 \(k1\) 的區間; 統計一下其中最多的顏色出現次數. 然后直接尺取法,然后每次對于 \(col[r]\) 進行統計,時間復雜度 \(O(n)\) . Code #include<bits/stdc.h> using …

智能記憶功能nest_如何設置和安裝Nest Protect智能煙霧報警器

智能記憶功能nestIf you want to add a bit more convenience and safety to your home’s smoke alarm setup, the Nest Protect comes with a handful of great features to make that a reality. Here’s how to set it up and what all you can do with it. 如果您想為您的…

網格自適應_ANSYS 非線性自適應(NLAD)網格劃分及應用舉例

文章來源&#xff1a;安世亞太官方訂閱號&#xff08;搜索&#xff1a;Peraglobal&#xff09;在復雜的結構設計分析中&#xff0c;通常很難確定在高應力區域中是否生成適當的細化網格。在做非線性大應變分析仿真時&#xff0c;可能由于單元變形過大&#xff0c;導致網格畸變&a…

js繼承優化

在看《js設計模式》中&#xff0c;作者提到了js中的兩種繼承方式&#xff1a;類繼承 或 原型繼承&#xff0c;或許是本人才疏學淺&#xff0c;竟發現一些問題。 一、類繼承 思路&#xff1a;作者的思路是使用基于類來繼承&#xff0c;并且做了一個extend函數&#xff0c;在第一…

python---[列表]lsit

內置數據結構&#xff08;變量類型&#xff09; -list -set -dict -tuple -list&#xff08;列表&#xff09; -一組又順序的數據組合 -創建列表 -空列表 list1 []        print(type(list1))        print(list1)        list2 [100]       …

喚醒計算機運行此任務_如何停止Windows 8喚醒計算機以運行維護

喚醒計算機運行此任務Windows 8 comes with a new hybrid boot system, this means that your PC is never really off. It also means that Windows has the permission to wake your PC as it needs. Here’s how to stop it from waking up your PC to do maintenance tasks…

轉整型_SPI轉can芯片CSM300詳解、Linux驅動移植調試筆記

一口君最近移植了一款SPI轉CAN的芯片CSM300A&#xff0c;在這里和大家做個分享。一、CSM300概述CSM300(A)系列是一款可以支持 SPI / UART 接口的CAN模塊。1. 簡介CSM300(A)系列隔離 SPI / UART 轉 CAN 模塊是集成微處理器、 CAN 收發器、 DC-DC 隔離電源、 信號隔離于一體的通信…

matlab練習程序(二值圖像連通區域標記法,一步法)

這個只需要遍歷一次圖像就能夠完全標記了。我主要參考了WIKI和這位兄弟的博客&#xff0c;這兩個把原理基本上該介紹的都介紹過了&#xff0c;我也不多說什么了。一步法代碼相比兩步法真是清晰又好看&#xff0c;似乎真的比兩步法要好很多。 代碼如下&#xff1a; clear all; c…

pc微信不支持flash_在出售PC之前,如何取消對Flash內容的授權

pc微信不支持flashWhen it comes to selling your old digital equipment you usually should wipe it of all digital traces with something like DBAN, however if you can’t there are some precautions you should take–here’s one related to Flash content you may h…

博客在線——Wireshark基本用法

http://blog.jobbole.com/ http://blog.jobbole.com/70907/轉載于:https://www.cnblogs.com/zhongbokun/p/9709326.html

繪制三維散點圖_SPSS統計作圖教程:三維散點圖

作者&#xff1a;豆沙包&#xff1b;審稿&#xff1a;張耀文1、問題與數據最大攜氧能力是身體健康的一項重要指標&#xff0c;但檢測該指標成本較高。研究者想根據性別、年齡、體重、運動后心率等指標建立預測最大攜氧能力的模型&#xff0c;招募了100名研究對象&#xff0c;測…

【Python】插入sqlite數據庫

import sqlite3 from datetime import datetimeconn sqlite3.connect(data.db) print("Opened database successfully")for i in range(100):time datetime.now()conn.execute("INSERT INTO test(time,url,imgPath) VALUES (?,?,?)", (time, "ww…

java數組轉list(Arrays .asList)

習慣性的錯誤代碼&#xff1a; Integer[] intArr {1,2,3}; List<Integer> lst Arrays .asList(intArr); lst.add(4); 報UnsupportedOperationException異常&#xff0c;原因是Arrays .asList() 返回的固定大小的列表&#xff0c;無法進行add、remove等操作&#xff1b;…

使用lodash防抖_什么,lodash 的防抖失效了?

戳藍字「前端技術優選」關注我們哦&#xff01;作者&#xff1a;yeyan1996https://juejin.im/post/6892577964458770445應某人的要求被迫營業&#xff0c;望各位看官不要吝嗇手中的贊-。-背景在使用 uni-app 開發小程序時&#xff0c;有個填寫表單的需求&#xff0c;包含兩個輸…

Ubuntu 12.10中的8個新功能,Quantal Quetzal

Ubuntu 12.10 has been released and you can download it now. From better integration with web apps and online services to improvements in Unity, there are quite a few changes – although none of them are huge or groundbreaking. Ubuntu 12.10已發布&#xff0c…

背單詞APP調研分析

前言&#xff1a;隨著我國網絡經濟重心向移動端的轉移&#xff0c;移動教育領域獲得的關注度在持續放大。互聯網的發展和移動設備的普及&#xff0c;我們開始在移動設備上學習&#xff0c;各種學習教育軟件如雨后春筍&#xff0c;越來越多&#xff0c;就背單詞軟件來說&#xf…

linux 提取cpio_Linux提取RPM包文件(cpio命令)詳解

在講解如何從 RPM 包中提取文件之前&#xff0c;先來系統學習一下 cpio 命令。cpio 命令用于從歸檔包中存入和讀取文件&#xff0c;換句話說&#xff0c;cpio 命令可以從歸檔包中提取文件(或目錄)&#xff0c;也可以將文件(或目錄)復制到歸檔包中。歸檔包&#xff0c;也可稱為文…