這里寫目錄標題
- 一、Resultful API的攔截三種方式
- 二、過濾器(Filter)的演示示例(springboot專案)
- 三、Filter過濾器特點
- 四、Filter過濾器、Interceptor攔截器 、Aspect切面起作用的順序
- 五、當控制層(即Controller層)的方法拋例外時,Filter過濾器、Interceptor攔截器 、Aspect切面 拋例外的順序
一、Resultful API的攔截三種方式
- 過濾器(Filter)
- 攔截器(Interceptor)
- 切片(Aspect)
二、過濾器(Filter)的演示示例(springboot專案)
1、自定義一個名稱為TimeFilter的過濾器,代碼如下:
package com.xz.springsecuritydemo.filter;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import java.io.IOException;
import java.util.Date;
@Component//添加該注解使過濾器啟作用,如果不使用@Component注解需要寫配置類,例lz寫的WebConfig進行注冊
public class TimeFilter implements Filter {
//在控制器方法(即controller類中的方法)呼叫之前呼叫
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Time Filter init");
}
//在控制器方法(即controller類中的方法)呼叫之后呼叫
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("Time Filter start");
long startTime = new Date().getTime();
chain.doFilter(request,response);
long endTime = new Date().getTime();
System.out.println("Filter耗時:"+(endTime-startTime));
System.out.println("Time Filter end");
}
//在控制器方法(即controller類中的方法)呼叫之后呼叫
@Override
public void destroy() {
System.out.println("Time Filter destroy");
}
}
2、自定義一個WebFilterConfig配置類,步驟1中如果不使用@Component注解,需要使用基于java的配置方式實作,代碼如下:
package com.xz.springsecuritydemo.filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
@Configuration
public class WebFilterConfig {
@Bean
public FilterRegistrationBean timeFilter(){
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
filterRegistrationBean.setFilter(new TimeFilter());
ArrayList<String> list = new ArrayList<>();
list.add("/*");//過濾所有路徑
filterRegistrationBean.setUrlPatterns(list);
return filterRegistrationBean;
}
}
3、自定義一個控制類,代碼如下
@RestController//表示此Controller提供RestAPI
public class SysQueryController {
/**
* @RequestMapping 映射http請求url到java方法
* @RequestParam 映射請求引數到java方法的引數
*/
@RequestMapping(value = "/user1",method = RequestMethod.GET)
public void query1(@RequestParam String username){
System.out.println("query1====="+username);
}
}
4、測驗步驟
-
啟動專案時會先輸出自定義過濾器類TimeFilter的init方式的資訊,如下圖:

-
再用postman測驗工具發送請求,如下圖:

-
最后查看控制態輸出資訊,如下圖:
//輸出內容 Time Filter start query1=====xz Filter耗時:128 Time Filter end
5、輸出第4步的內容表示自定義的Filter過濾器成功,
三、Filter過濾器特點
- 由上面的示例可知:Filter過濾器可以獲取到原始的http請求和回應的資訊,但是獲取不到真正處理請求的方法資訊,
四、Filter過濾器、Interceptor攔截器 、Aspect切面起作用的順序
- 先是Filter過濾器起作用
- 然后Interceptor攔截器起作用
- 然后Aspect切面起作用
- 最后進入Controller方法中
五、當控制層(即Controller層)的方法拋例外時,Filter過濾器、Interceptor攔截器 、Aspect切面 拋例外的順序
- 先是Aspect切面
- 如果使用@ControllerAdvice自定義例外,再進入這個處理例外類
- 然后Interceptor攔截器
- 然后Filter過濾器
- 如果都沒處理,最后到tomcat
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298096.html
標籤:其他
