亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一、簡(jiǎn)介

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

1、過濾器

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

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

我們可以通過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)限訪問控制、過濾敏感詞匯、壓縮響應(yīng)信息、字符集統(tǒng)一等一些高級(jí)功能。它主要用于對(duì)用戶請(qǐng)求進(jìn)行預(yù)處理,也可以對(duì)HttpServletResponse進(jìn)行后處理。使用Filter的完整流程:Filter對(duì)用戶請(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í)候才銷毀。(每次熱部署后,都會(huì)銷毀)。

2、攔截器

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

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

3、監(jiān)聽器

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

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

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

二、如何創(chuàng)建

1、過濾器

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

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

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

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

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

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

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{
     /**
      * 容器加載的時(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");
          }
      }
      /**
       * 容器被銷毀的時(shí)候被調(diào)用
       */
      @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("======進(jìn)入監(jiān)聽器========");
    }

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é)

最后總解一下他們:

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

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

相關(guān)文章

  • 利用spring boot如何快速啟動(dòng)一個(gè)web項(xiàng)目詳解

    利用spring boot如何快速啟動(dòng)一個(gè)web項(xiàng)目詳解

    這篇文章主要給大家介紹了關(guān)于利用spring boot如何快速啟動(dòng)一個(gè)web項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧、
    2017-12-12
  • springboot全局異常處理詳解

    springboot全局異常處理詳解

    本篇文章主要介紹了springboot全局異常處理詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • java圖片對(duì)比度調(diào)整示例代碼

    java圖片對(duì)比度調(diào)整示例代碼

    這篇文章主要給大家介紹了關(guān)于java圖片對(duì)比度調(diào)整的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 一不小心就讓Java開發(fā)踩坑的fail-fast是個(gè)什么鬼?(推薦)

    一不小心就讓Java開發(fā)踩坑的fail-fast是個(gè)什么鬼?(推薦)

    這篇文章主要介紹了Java fail-fast,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java Web項(xiàng)目中編寫定時(shí)任務(wù)的實(shí)現(xiàn)

    Java Web項(xiàng)目中編寫定時(shí)任務(wù)的實(shí)現(xiàn)

    本篇文章主要介紹了Java Web項(xiàng)目中編寫定時(shí)任務(wù)的實(shí)現(xiàn),具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01
  • Java并發(fā)線程之線程池的知識(shí)總結(jié)

    Java并發(fā)線程之線程池的知識(shí)總結(jié)

    這篇文章主要介紹了Java并發(fā)線程之線程池的知識(shí)總結(jié),幫助大家更好的理解和學(xué)習(xí)Java并發(fā)線程的相關(guān)內(nèi)容,感興趣的朋友可以了解下
    2021-01-01
  • Java實(shí)現(xiàn)添加文字水印&圖片水印的方法詳解

    Java實(shí)現(xiàn)添加文字水印&圖片水印的方法詳解

    為圖片添加水印的主要作用是保護(hù)圖片版權(quán),防止圖片被未經(jīng)授權(quán)的人使用或傳播。本文為大家介紹了Java實(shí)現(xiàn)添加文字水印&圖片水印的具體方法,需要的可以參考一下
    2023-02-02
  • 詳解Java中二叉樹的基礎(chǔ)概念(遞歸&迭代)

    詳解Java中二叉樹的基礎(chǔ)概念(遞歸&迭代)

    二叉樹(Binary?tree)是樹形結(jié)構(gòu)的一個(gè)重要類型。本文將通過圖片和示例代碼詳細(xì)為大家講解一下Java中的二叉樹的基礎(chǔ)概念,需要的可以參考一下
    2022-03-03
  • 如何讓Jackson JSON生成的數(shù)據(jù)包含的中文以u(píng)nicode方式編碼

    如何讓Jackson JSON生成的數(shù)據(jù)包含的中文以u(píng)nicode方式編碼

    這篇文章主要介紹了如何讓Jackson JSON生成的數(shù)據(jù)包含的中文以u(píng)nicode方式編碼。需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-12-12
  • maven配置阿里倉庫的方法步驟

    maven配置阿里倉庫的方法步驟

    這篇文章主要介紹了maven配置阿里倉庫的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評(píng)論