Eclipse搭建springboot項目(八)攔截器、過濾器、監聽器


知識點:

1、SpringBoot2.x過濾器Filter和使用Servlet3.0配置自定義Filter(核心知識)

  filter簡單理解:人--->檢票員(filter)---> 景點

  1)SpringBoot啟動默認加載的Filter
    characterEncodingFilter
    hiddenHttpMethodFilter
    httpPutFormContentFilter
    requestContextFilter

  2)Filter優先級

    Ordered.HIGHEST_PRECEDENCE
    Ordered.LOWEST_PRECEDENCE

    低位值意味着更高的優先級 Higher values are interpreted as lower priority
    自定義Filter,避免和默認的Filter優先級一樣,不然會沖突

    注冊Filter的bean FilterRegistrationBean
    同模塊里面有相關默認Filter
    web->servlet->filter


  3)自定義Filter
    a)使用Servlet3.0的注解進行配置
    b)啟動類里面增加 @ServletComponentScan,進行掃描
    c)新建一個Filter類,implements Filter,並實現對應的接口
    d) @WebFilter 標記一個類為filter,被spring進行掃描
      urlPatterns:攔截規則,支持正則

    e)控制chain.doFilter的方法的調用,來實現是否通過放行
      不放行,web應用resp.sendRedirect("/index.html");
      場景:權限控制、用戶登錄(非前端后端分離場景)等

  4)官網地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners

 


2、Servlet3.0的注解自定義原生Servlet實戰
  講解:使用 Servlet3.0的注解自定義原生Servlet和Listener
  1) 自定義原生Servlet

 @WebServlet(name = "userServlet",urlPatterns = "/test/customs")
    public class UserServlet extends HttpServlet{

      @Override
      public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("custom sevlet");
        resp.getWriter().flush();
        resp.getWriter().close();
      }

      @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
      }
    }

3、Servlet3.0的注解自定義原生Listener監聽器實戰
  簡介:監聽器介紹和Servlet3.0的注解自定義原生Listener監聽器實戰

  1) 自定義Listener(常用的監聽器 servletContextListener、httpSessionListener、servletRequestListener)

    @WebListener
    public class RequestListener implements ServletRequestListener {

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
      // TODO Auto-generated method stub
      System.out.println("======requestDestroyed========");
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
      System.out.println("======requestInitialized========");
    }


4、SpringBoot2.X自定義攔截器實戰及新舊配置對比(核心知識)
  簡介: 講解攔截器使用,Spingboot2.x新版本配置攔截攔截器和舊版本SpringBoot配置攔截器區別講解

  1) @Configuration
  繼承WebMvcConfigurationAdapter(SpringBoot2.X之前舊版本)

  SpringBoot2.X 新版本配置攔截器 implements WebMvcConfigurer

  2) 自定義攔截器 HandlerInterceptor
  preHandle:調用Controller某個方法之前
  postHandle:Controller之后調用,視圖渲染之前,如果控制器Controller出現了異常,則不會執行此方法
  afterCompletion:不管有沒有異常,這個afterCompletion都會被調用,用於資源清理

  3) 按照注冊順序進行攔截,先注冊,先被攔截

  攔截器不生效常見問題:
    a)是否有加@Configuration
    b)攔截路徑是否有問題 ** 和 *
    c)攔截器最后路徑一定要 “/**”, 如果是目錄的話則是 /*/

  Filter
  是基於函數回調 doFilter(),而Interceptor則是基於AOP思想
  Filter在只在Servlet前后起作用,而Interceptor夠深入到方法前后、異常拋出前后等
  依賴於Servlet容器即web應用中,而Interceptor不依賴於Servlet容器所以可以運行在多種環境。
  在接口調用的生命周期里,Interceptor可以被多次調用,而Filter只能在容器初始化時調用一次。
  Filter和Interceptor的執行順序
  過濾前->攔截前->action執行->攔截后->過濾后

 

 

 

過濾器、攔截器、監聽器的區別:

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 判斷當前時間是否是購票時間。

對比一下其實我們可以發現,過濾器能做的事攔截器都能做,二攔截器做的事過濾器不一定做的了。

3、監聽器

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

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

過濾器和攔截器的區別示意圖:

請求鏈路說明:

總結:

過濾器:用於屬性甄別,對象收集(不可改變過濾對象的屬性和行為)

監聽器:用於對象監聽,行為記錄(不可改變監聽對象的屬性和行為)

攔截器:用於對象攔截,行為干預(可以改變攔截對象的屬性和行為)

如何創建:

1、過濾器
自定義Filter 使用Servlet3.0的注解進行配置第三步的@WebFilter就是3.0的注解

       1)啟動類里面增加 @ServletComponentScan,進行掃描

       2)新建一個Filter類,implements Filter,並實現對應的接口

        3) @WebFilter 標記一個類為filter,被spring進行掃描

        urlPatterns:攔截規則,支持正則

        4)控制chain.doFilter的方法的調用,來實現是否通過放行不放行,web應用resp.sendRedirect("/index.html");場景:權限控制、用戶登錄(非前端后端分離場景)等

  application類

  官網地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners

2、監聽器

3、攔截器

  CustomWebMvcConfigurer主攔截器需要:

      1)、添加@Configuration注解

      2)、實現WebMvcConfigurer接口

原文:https://blog.csdn.net/yudiandemingzi/article/details/80399971

 


免責聲明!

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



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