springBoot2.X---過濾器,監聽器,攔截器


過濾器,監聽器,攔截器
 

一、畫圖理解 過濾器(filter),監聽器(listener),攔截器(Interceptor)。
  

 


 

   通過兩幅圖我們可以理解攔截器和過濾器的特點

1、過濾器

  過濾器是在請求進入tomcat容器后,但請求進入servlet之前進行預處理的。請求結束返回也是,是在servlet處理完后,返回給前端之前。

      理解上面這句話我們就可以知道,進入servlet之前,主要是兩個參數:ServletRequest,ServletResponse  那我們得到這兩個測試可以干哪些事呢?

     我們可以通過ServletRequest得到HttpServletRequest,此時你就可以對請求或響應(Request、Response)那就可以對對web服務器管理的所有web資源:例如Jsp, Servlet, 靜態圖片文件或靜態 html 文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮響應信息、字符集統一等一些高級功能。它主要用於對用戶請求進行預處理,也可以對HttpServletResponse進行后處理。使用Filter的完整流程:Filter對用戶請求進行預處理,接着將請求交給Servlet進行處理並生成響應,最后Filter再對服務器響應進行后處理。。它是隨你的web應用啟動而啟動的,只初始化一次,以后就可以攔截相關請求,只有當你的web應用停止或重新部署的時候才銷毀。(每次熱部署后,都會銷毀)

2、攔截器

從上圖我們可以看出過濾器只在servlet前后起作用,所以它可以捕獲異常,獲得bean對象等,這些是只能是進入servlet里面的攔截器能過做到。攔截器中用於在某個方法或字段被訪問之前,進行攔截然后,在之前或之后加入某些操作。比如日志,安全等。一般攔截器方法都是通過動態代理的方式實現。可以通過它來進行權限驗證,或者判斷用戶是否登陸,或者是像12306 判斷當前時間是否是購票時間。  過濾器執行時間=》

1.調用方法前=preHandle()

2.調用完controller之后,視圖渲染之前=postHandle()

3.整個完成之后,通常用於資源清理=afterCompletion()

 

3、監聽器

listener是servlet規范中定義的一種特殊類。用於監聽servletContext、HttpSession和servletRequest等域對象的創建和銷毀事件。監聽域對象的屬性發生修改的事件。用於在事件發生前、發生后做一些必要的處理。其主要可用於以下方面:1、統計在線人數和在線用戶2、系統啟動時加載初始化信息3、統計網站訪問量4、記錄用戶訪問路徑。 他在項目中啟動的時候實例化

常用的監聽器 servletContextListener、httpSessionListener、servletRequestListener)

過濾器和攔截器對比

(1)、Filter需要在web.xml中注冊,依賴於Servlet;
(2)、Interceptor需要在SpringMVC中注冊,依賴於web框架;
(3)、Filter是基於函數回調 doFilter(),而Interceptor則是基於AOP思想
(4)、在一次請求的生命周期內,Filter在只在Servlet前后起作用,而Interceptor夠深入到方法前,方法里,方法后、異常拋出前后 起作用


在接口調用的生命周期里,Interceptor可以被多次調用,而Filter只能在容器初始化時調用一次。

(1)過濾器(Filter):當你有一堆東西的時候,你只希望選擇符合你要求的某一些東西。定義這些要求的工具,就是過濾器。(理解:就是一堆字母中取一個B) 在進入某個contorller前,進行操作。

(2)攔截器(Interceptor):在一個流程正在進行的時候,你希望干預它的進展,甚至終止它進行,這是攔截器做的事情。(理解:就是一堆字母中,干預他,通過驗證的少點,順便干點別的東西)。 可以在進入方法前,方法中,方法后,進行操作。


Filter和Interceptor的執行順序

過濾前->攔截前->action執行->攔截后->過濾后

 

4.概念講完了,現在來貼代碼

filter(過濾器)和Listener(監聽器)  配置前需要在 啟動類中加 @ServletComponentScan 才會生效。攔截器(Interceptor)不需要

@SpringBootApplication
@ServletComponentScan
public class DemoApplication extends SpringBootServletInitializer{

public static void main(String[] args) {

SpringApplication.run(DemoApplication.class, args);

}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoApplication.class);
}


}

a.過濾器filter

/***
* @author: wangbs
* @create: 2019/1/23 17:14
*/

@WebFilter(urlPatterns = "/api/*", filterName = "loginFilter")
public class LoginFilter implements Filter{
/**
* 容器加載的時候調用
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init loginFilter");
}
/**
* 請求被攔截的時候進行調用
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter loginFilter");

HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
String username = req.getParameter("username");

if ("xdclass".equals(username)) {
filterChain.doFilter(servletRequest,servletResponse);
} else {
resp.sendRedirect("/index.html");
return;
}
}
/**
* 容器被銷毀的時候被調用
*/
@Override
public void destroy() {
System.out.println("destroy loginFilter");
}
}

b.攔截器 Intercepter (兩步 1.自定義一個Interceptor 2. 注冊)

1.自定義一個Interceptor

/***
* @author: wangbs
* @create: 2019/1/23 17:17
*/

public class LoginIntercepter implements HandlerInterceptor{

/**
* 進入controller方法之前
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
/**
* 調用完controller之后,視圖渲染之前
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
/**
* 整個完成之后,通常用於資源清理
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
2.注冊
@Configuration
public class CustomWebMvcConfigurer implements WebMvcConfigurer {

@Override
public void addInterceptors(InterceptorRegistry registry) {
//注冊多個Interceptor 注意路徑的寫法
registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api2/*/**");
registry.addInterceptor(new TwoIntercepter()).addPathPatterns("/api2/*/**");
//注冊某個攔截器的時候,同時排除某些不攔截的路徑
//registry.addInterceptor(new TwoIntercepter()).addPathPatterns("/api2/*/**").excludePathPatterns("/api2/xxx/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
}

3.Listener(監聽器)@WebListenerpublic class CustomContextListener implements ServletContextListener{

@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("======contextInitialized========");

}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("======contextDestroyed========");
}
}

springmvc https://blog.csdn.net/zxd1435513775/article/details/80556034


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM