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

SpringBoot 過(guò)濾器, 攔截器, 監(jiān)聽(tīng)器的具體使用

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

一、簡(jiǎn)介

通過(guò)兩幅圖我們可以理解攔截器和過(guò)濾器的特點(diǎn)

1、過(guò)濾器

過(guò)濾器是在請(qǐng)求進(jìn)入tomcat容器后,但請(qǐng)求進(jìn)入servlet之前進(jìn)行預(yù)處理的。請(qǐng)求結(jié)束返回也是,是在servlet處理完后,返回給前端之前。

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

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

2、攔截器

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

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

3、監(jiān)聽(tīng)器

listener是servlet規(guī)范中定義的一種特殊類(lèi)。用于監(jiān)聽(tīng)servletContext、HttpSession和servletRequest等域?qū)ο蟮膭?chuàng)建和銷(xiāo)毀事件。監(jiān)聽(tīng)域?qū)ο蟮膶傩园l(fā)生修改的事件。用于在事件發(fā)生前、發(fā)生后做一些必要的處理。其主要可用于以下方面:

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

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

二、如何創(chuàng)建

1、過(guò)濾器

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

1)啟動(dòng)類(lèi)里面增加 @ServletComponentScan,進(jìn)行掃描

2)新建一個(gè)Filter類(lèi),implements Filter,并實(shí)現(xiàn)對(duì)應(yīng)的接口

3)@WebFilter 標(biāo)記一個(gè)類(lèi)為filter,被spring進(jìn)行掃描

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

4)控制chain.doFilter的方法的調(diào)用,來(lái)實(shí)現(xiàn)是否通過(guò)放行不放行,web應(yīng)用resp.sendRedirect("/index.html");場(chǎng)景:權(quán)限控制、用戶(hù)登錄(非前端后端分離場(chǎng)景)等

application類(lèi)

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

LoginFilter過(guò)濾器

//過(guò)濾器攔截路徑
@WebFilter(urlPatterns = "/api/*", filterName = "loginFilter")
public class LoginFilter  implements Filter{
     /**
      * 容器加載的時(shí)候調(diào)用
      */
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {
          System.out.println("攔截器進(jìn)入========攔截器進(jìn)入========");
      }
      /**
       * 請(qǐng)求被攔截的時(shí)候進(jìn)行調(diào)用
       */
      @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");
          }
      }
      /**
       * 容器被銷(xiāo)毀的時(shí)候被調(diào)用
       */
      @Override
      public void destroy() {
          System.out.println("攔截器銷(xiāo)毀========攔截器銷(xiāo)毀========");
      }
}

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)聽(tīng)器

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

3、攔截器

CustomWebMvcConfigurer主攔截器需要:

  • 添加@Configuration注解
  • 實(shí)現(xiàn)WebMvcConfigurer接口
//主攔截器,根據(jù)攔截不同路徑跳轉(zhuǎn)不同自定義攔截器 (實(shí)現(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{
    /**
     * 進(jìn)入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);
    }
    /**
     * 調(diào)用完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);
    }
    /**
     * 整個(gè)完成之后,通常用于資源清理
     */
    @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é)

最后總解一下他們:

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

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

相關(guān)文章

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

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

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

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

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

    Map之computeIfAbsent使用解讀

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

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

    這篇文章主要介紹了深入剖析Java中的各種異常處理方式,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-07-07
  • Java Web會(huì)話(huà)技術(shù)Session的簡(jiǎn)單使用

    Java Web會(huì)話(huà)技術(shù)Session的簡(jiǎn)單使用

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

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

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

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

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

    Spring之spring-context-indexer依賴(lài)詳解

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

    在實(shí)踐中了解Java反射機(jī)制應(yīng)用

    當(dāng)程序運(yùn)行時(shí),允許改變程序結(jié)構(gòu)或變量類(lèi)型,這種語(yǔ)言稱(chēng)為動(dòng)態(tài)語(yǔ)言。我們認(rèn)為java并不是動(dòng)態(tài)語(yǔ)言,但是它卻有一個(gè)非常突出的動(dòng)態(tài)相關(guān)機(jī)制,俗稱(chēng):反射。下面我們來(lái)簡(jiǎn)單學(xué)習(xí)一下吧
    2019-05-05
  • Redis分布式鎖介紹與使用

    Redis分布式鎖介紹與使用

    服務(wù)器集群項(xiàng)目中的鎖是無(wú)法精準(zhǔn)的鎖住線(xiàn)程資源的,于是我們就是需要使用分布式鎖,分布式鎖該如何使用又有什么注意點(diǎn)呢?就讓我們進(jìn)入接下來(lái)的學(xué)習(xí)
    2022-09-09

最新評(píng)論

油尖旺区| 四子王旗| 凤庆县| 宁城县| 西峡县| 松潘县| 城固县| 措勤县| 大新县| 三明市| 卓尼县| 弥渡县| 永春县| 郓城县| 呼图壁县| 利辛县| 东乡族自治县| 志丹县| 斗六市| 永德县| 盘锦市| 邢台市| 沂源县| 札达县| 汽车| 大英县| 朝阳市| 东乡县| 天门市| 沁水县| 苏尼特左旗| 永清县| 花莲市| 乌鲁木齐县| 新巴尔虎右旗| 邵东县| 富阳市| 神农架林区| 平利县| 兴山县| 南阳市|