最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot 過濾器, 攔截器, 監(jiān)聽器的具體使用

 更新時間:2023年05月17日 08:29:35   作者:鶴沖天Pro  
本文主要介紹了SpringBoot 過濾器, 攔截器, 監(jiān)聽器的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、簡介

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

1、過濾器

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

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

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

2、攔截器

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

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

3、監(jiān)聽器

listener是servlet規(guī)范中定義的一種特殊類。用于監(jiān)聽servletContext、HttpSession和servletRequest等域對象的創(chuàng)建和銷毀事件。監(jiān)聽域對象的屬性發(fā)生修改的事件。用于在事件發(fā)生前、發(fā)生后做一些必要的處理。其主要可用于以下方面:

  • 1、統(tǒng)計在線人數(shù)和在線用戶
  • 2、系統(tǒng)啟動時加載初始化信息
  • 3、統(tǒng)計網(wǎng)站訪問量
  • 4、記錄用戶訪問路徑。

常用的監(jiān)聽器 servletContextListener、httpSessionListener、servletRequestListener)

二、如何創(chuàng)建

1、過濾器

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

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

2)新建一個Filter類,implements Filter,并實現(xiàn)對應的接口

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

urlPatterns:攔截規(guī)則,支持正則

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

application類

@SpringBootApplication
@ServletComponentScan
public class SpringbootstudyApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootstudyApplication.class, args);
    }
}

LoginFilter過濾器

//過濾器攔截路徑
@WebFilter(urlPatterns = "/api/*", filterName = "loginFilter")
public class LoginFilter  implements Filter{
     /**
      * 容器加載的時候調用
      */
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {
          System.out.println("攔截器進入========攔截器進入========");
      }
      /**
       * 請求被攔截的時候進行調用
       */
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
          System.out.println("攔截中========攔截中========");
          HttpServletRequest hrequest = (HttpServletRequest)servletRequest;
          HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);
          if(hrequest.getRequestURI().indexOf("/index") != -1 ||
                  hrequest.getRequestURI().indexOf("/asd") != -1 ||
                  hrequest.getRequestURI().indexOf("/online") != -1 ||
                  hrequest.getRequestURI().indexOf("/login") != -1
                  ) {
              filterChain.doFilter(servletRequest, servletResponse);
          }else {
              wrapper.sendRedirect("/login");
          }
      }
      /**
       * 容器被銷毀的時候被調用
       */
      @Override
      public void destroy() {
          System.out.println("攔截器銷毀========攔截器銷毀========");
      }
}

1、官網(wǎng)地址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners

2、監(jiān)聽器

@WebListener
public class RequestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        // TODO Auto-generated method stub
        System.out.println("======銷毀監(jiān)聽器========");
    }
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("======進入監(jiān)聽器========");
    }

3、攔截器

CustomWebMvcConfigurer主攔截器需要:

  • 添加@Configuration注解
  • 實現(xiàn)WebMvcConfigurer接口
//主攔截器,根據(jù)攔截不同路徑跳轉不同自定義攔截器 (實現(xiàn)WebMvcConfigurer方法)
@Configuration
public class CustomWebMvcConfigurer implements WebMvcConfigurer  {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api1/*/**");
        registry.addInterceptor(new TwoIntercepter()).addPathPatterns("/api2/*/**");
        //.excludePathPatterns("/api2/xxx/**"); //攔截全部 /*/*/**
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

LoginIntercepter子攔截器

public class LoginIntercepter implements HandlerInterceptor{
    /**
     * 進入controller方法之前
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("LoginIntercepter------->preHandle");
//        String token = request.getParameter("access_token");
//        
//        response.getWriter().print("fail");
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }
    /**
     * 調用完controller之后,視圖渲染之前
     */
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("LoginIntercepter------->postHandle");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    /**
     * 整個完成之后,通常用于資源清理
     */
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("LoginIntercepter------->afterCompletion");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

TwoIntercepter同上

三、總結

最后總解一下他們:

  • 過濾器:用于屬性甄別,對象收集(不可改變過濾對象的屬性和行為)
  • 監(jiān)聽器:用于對象監(jiān)聽,行為記錄(不可改變監(jiān)聽對象的屬性和行為)
  • 攔截器:用于對象攔截,行為干預(可以改變攔截對象的屬性和行為)

到此這篇關于SpringBoot 過濾器, 攔截器, 監(jiān)聽器的具體使用的文章就介紹到這了,更多相關SpringBoot過濾器 監(jiān)聽器 攔截器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring事件監(jiān)聽器@EventListener與publishEvent的使用

    Spring事件監(jiān)聽器@EventListener與publishEvent的使用

    Spring可以通過事件監(jiān)聽器機制來處理應用程序中的事件,本文主要介紹了Spring事件監(jiān)聽器@EventListener與publishEvent的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Java常用數(shù)字工具類 大數(shù)乘法、加法、減法運算(2)

    Java常用數(shù)字工具類 大數(shù)乘法、加法、減法運算(2)

    這篇文章主要為大家詳細介紹了Java常用數(shù)字工具類,大數(shù)乘法、加法、減法運算,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Map之computeIfAbsent使用解讀

    Map之computeIfAbsent使用解讀

    `computeIfAbsent`是Java 8引入的一個Map接口方法,用于簡化在Map中獲取值的操作,如果指定的鍵不存在,它會調用提供的函數(shù)生成一個新的值,并將其與鍵關聯(lián),這種方法減少了手動檢查和插入的樣板代碼,使代碼更加簡潔和易讀
    2025-02-02
  • 深入剖析Java中的各種異常處理方式

    深入剖析Java中的各種異常處理方式

    這篇文章主要介紹了深入剖析Java中的各種異常處理方式,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-07-07
  • Java Web會話技術Session的簡單使用

    Java Web會話技術Session的簡單使用

    在請求需要傳遞的信息比較多,使用Cookie技術就會增大請求的難度。而Session可以存儲對象、數(shù)組等信息,并且Session是存儲到服務器端的,在客戶端請求時只需要將session id一并攜帶給服務器端。本文將簡單的介紹如何使用Session
    2021-05-05
  • 關于SpringBoot使用Redis空指針的問題(不能成功注入的問題)

    關于SpringBoot使用Redis空指針的問題(不能成功注入的問題)

    這篇文章主要介紹了關于SpringBoot使用Redis空指針的問題(不能成功注入的問題),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Java中print、printf、println的區(qū)別

    Java中print、printf、println的區(qū)別

    這篇文章主要介紹了Java中print、printf、println的區(qū)別的相關資料,需要的朋友可以參考下
    2023-03-03
  • Spring之spring-context-indexer依賴詳解

    Spring之spring-context-indexer依賴詳解

    這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 在實踐中了解Java反射機制應用

    在實踐中了解Java反射機制應用

    當程序運行時,允許改變程序結構或變量類型,這種語言稱為動態(tài)語言。我們認為java并不是動態(tài)語言,但是它卻有一個非常突出的動態(tài)相關機制,俗稱:反射。下面我們來簡單學習一下吧
    2019-05-05
  • Redis分布式鎖介紹與使用

    Redis分布式鎖介紹與使用

    服務器集群項目中的鎖是無法精準的鎖住線程資源的,于是我們就是需要使用分布式鎖,分布式鎖該如何使用又有什么注意點呢?就讓我們進入接下來的學習
    2022-09-09

最新評論

广德县| 德昌县| 巩义市| 金川县| 额尔古纳市| 海南省| 乌什县| 时尚| 滕州市| 合阳县| 蛟河市| 上杭县| 镇赉县| 长宁区| 太康县| 洛浦县| 光山县| 沙河市| 西峡县| 吕梁市| 桃源县| 晋州市| 娄底市| 什邡市| 田阳县| 怀仁县| 商水县| 南汇区| 柳河县| 大渡口区| 特克斯县| 怀远县| 新疆| 华容县| 双峰县| 额尔古纳市| 长治县| 长汀县| 大名县| 屏边| 武鸣县|