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

SpringMVC超詳細(xì)介紹自定義攔截器

 更新時(shí)間:2022年06月22日 09:26:13   作者:llp1110  
Spring?MVC?的攔截器(Interceptor)與?Java?Servlet?的過(guò)濾器(Filter)類(lèi)似,它主要用于攔截用戶的請(qǐng)求并做相應(yīng)的處理,通常應(yīng)用在權(quán)限驗(yàn)證、記錄請(qǐng)求信息的日志、判斷用戶是否登錄等功能上。本文將代碼演示和文字描述詳解攔截器的原理與使用

1.什么是攔截器

說(shuō)明

  • Spring MVC 也可以使用攔截器對(duì)請(qǐng)求進(jìn)行攔截處理,用戶可以自定義攔截器來(lái)實(shí)現(xiàn)特定的功能.
  • 自定義的攔截器必須實(shí)現(xiàn) HandlerInterceptor 接口

自定義攔截器的三個(gè)方法

  • preHandle():這個(gè)方法在業(yè)務(wù)處理器處理請(qǐng)求之前被調(diào)用,在該方法中對(duì)用戶請(qǐng)求 request 進(jìn)行處理。
  • postHandle():這個(gè)方法在目標(biāo)方法處理完請(qǐng)求后執(zhí)行
  • afterCompletion():這個(gè)方法在完全處理完請(qǐng)求后被調(diào)用,可以在該方法中進(jìn)行一些資源 清理的操作。

2.自定義攔截器執(zhí)行流程圖

自定義攔截器執(zhí)行流程說(shuō)明

  • 如果 preHandle 方法 返回 false, 則不再執(zhí)行目標(biāo)方法, 可以在此指定返回頁(yè)面
  • postHandle 在目標(biāo)方法被執(zhí)行后執(zhí)行. 可以在方法中訪問(wèn)到目標(biāo)方法返回的 ModelAndView 對(duì)象
  • 若 preHandle 返回 true, 則 afterCompletion 方法 在渲染視圖之后被執(zhí)行.
  • 若 preHandle 返回 false, 則 afterCompletion 方法不會(huì)被調(diào)用
  • 在配置攔截器時(shí),可以指定該攔截器對(duì)哪些請(qǐng)求生效,哪些請(qǐng)求不生效,如果不配置默認(rèn)對(duì)所有請(qǐng)求生效

3.自定義攔截器應(yīng)用實(shí)例

1.快速入門(mén)

● 應(yīng)用實(shí)例需求

完成一個(gè)自定義攔截器,學(xué)習(xí)一下如何配置攔截器和攔截器的運(yùn)行流程

● 應(yīng)用實(shí)例-代碼實(shí)現(xiàn)

1.自定義攔截器

/**
 * 自定義攔截器
 */
@Component
public class MyInterceptor01 implements HandlerInterceptor {
    /**
     * 1.preHandle 方法在目標(biāo)方法執(zhí)行前被執(zhí)行
     * 2.如果返回fasle則不在執(zhí)行目標(biāo)方法
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor01 --preHandle");
        return true;
    }
    /**
     * 1. 在目標(biāo)方法執(zhí)行后,會(huì)執(zhí)行postHandle
     * 2. 該方法可以獲取到 目標(biāo)方法,返回的ModelAndView對(duì)象
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor01-postHandle");
    }
    /**
     *1. afterCompletion() 在視圖渲染后被執(zhí)行, 這里可以進(jìn)行資源清理工作
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor01-afterCompletion");
    }
}

2.配置攔截器

攔截配置有三種方式

(1)不指定攔截規(guī)則,默認(rèn)攔截所有

<!--配置自定義攔截器-spring配置文件-->
<mvc:interceptors>
    <!--第一種方式,不指定攔截規(guī)則默認(rèn)攔截所有請(qǐng)求-->
    <ref bean="myInterceptor01"></ref>
</mvc:interceptors>

(2)指定明確的攔截路徑

<!--配置自定義攔截器-spring配置文件-->
<mvc:interceptors>
    <!--第一種方式,不指定攔截規(guī)則默認(rèn)攔截所有請(qǐng)求-->
    <!--<ref bean="myInterceptor01"></ref>-->
    <!--第二種指定攔截路徑-->
    <mvc:interceptor>
        <mvc:mapping path="/hi"/>
        <ref bean="myInterceptor01"/>
    </mvc:interceptor>
</mvc:interceptors>

(3)通配符方式,也可用于指定不攔截路徑

    <!--配置自定義攔截器-spring配置文件-->
    <mvc:interceptors>
        <!--第一種方式,不指定攔截規(guī)則默認(rèn)攔截所有請(qǐng)求-->
        <!--<ref bean="myInterceptor01"></ref>-->
        <!--第二種指定攔截路徑-->
  <!--      <mvc:interceptor>
            <mvc:mapping path="/hi"/>
            <ref bean="myInterceptor01"/>
        </mvc:interceptor>-->
      <mvc:interceptor>
          <!--通配符方式 表示攔截 /h 打頭的路徑-->
          <mvc:mapping path="/h*"/>
          <!--/hello不攔截-->
          <mvc:exclude-mapping path="/hello"/>
          <!--指定對(duì)哪個(gè)攔截器配置-->
          <ref bean="myInterceptor01"/>
      </mvc:interceptor>
    </mvc:interceptors>

3.創(chuàng)建FurnHandler.java

@Controller
public class FurnHandler {
    @RequestMapping(value = "/hi")
    public String hi(User user) {
        System.out.println("---FurnHandler--hi()---");
        return "success";
    }
    @RequestMapping(value = "/hello")
    public String hello() {
        System.out.println("---FurnHandler--hello()---");
        return "success";
    }
    @RequestMapping(value = "/ok")
    public String ok() {
        System.out.println("---FurnHandler--ok()---");
        return "success";
    }
}

4.interceptor.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>測(cè)試自定義攔截器</title>
</head>
<body>
<h1>測(cè)試自定義攔截器</h1>
<a href="<%=request.getContextPath()%>/hi" rel="external nofollow" >測(cè)試自定義攔截器-hi</a><br><br>
<a href="<%=request.getContextPath()%>/hello" rel="external nofollow" >測(cè)試自定義攔截器-hello</a><br/><br/>
<a href="<%=request.getContextPath()%>/ok" rel="external nofollow" >測(cè)試自定義攔截器-ok</a><br><br>
</body>
</html>

5.測(cè)試

2.注意事項(xiàng)和細(xì)節(jié)

1、默認(rèn)配置是都所有的目標(biāo)方法都進(jìn)行攔截, 也可以指定攔截目標(biāo)方法, 比如只是攔截 hi

<mvc:interceptor> 
    <mvc:mapping path="/hi"/> 
    <ref bean="myInterceptor01"/> 
</mvc:interceptor>

2、mvc:mapping 支持通配符, 同時(shí)指定不對(duì)哪些目標(biāo)方法進(jìn)行攔截

<mvc:interceptor> 
    <mvc:mapping path="/h*"/> 
    <mvc:exclude-mapping path="/hello"/> 
    <ref bean="myInterceptor01"/> 
</mvc:interceptor>

3、攔截器需要配置才生效,不配置是不生效的.

4、如果 preHandler() 方法返回了 false, 就不會(huì)執(zhí)行目標(biāo)方法(前提是你的目標(biāo)方法被攔截 了), 程序員可以在這里根據(jù)業(yè)務(wù)需要指定跳轉(zhuǎn)頁(yè)面.

3.Debug執(zhí)行流程

4.多個(gè)攔截器

1.多個(gè)攔截器執(zhí)行流程示意圖

執(zhí)行流程可以參考filter過(guò)濾器,執(zhí)行順序根據(jù)配置的先后順序

2.應(yīng)用實(shí)例

代碼實(shí)現(xiàn)

新增攔截器

@Component
public class MyInterceptor02 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor02-preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor02-postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor02-afterCompletion");
    }
}

配置攔截器

  <!--配置自定義攔截器-spring配置文件-->
  <mvc:interceptors>
      <!--第一種方式,不指定攔截規(guī)則默認(rèn)攔截所有請(qǐng)求-->
      <!--<ref bean="myInterceptor01"></ref>-->
      <!--第二種指定攔截路徑-->
<!--      <mvc:interceptor>
          <mvc:mapping path="/hi"/>
          <ref bean="myInterceptor01"/>
      </mvc:interceptor>-->
    <mvc:interceptor>
        <!--通配符方式 表示攔截 /h 打頭的路徑-->
        <mvc:mapping path="/h*"/>
        <!--/hello不攔截-->
        <mvc:exclude-mapping path="/hello"/>
        <!--指定對(duì)哪個(gè)攔截器配置-->
        <ref bean="myInterceptor01"/>
    </mvc:interceptor>
      <mvc:interceptor>
          <mvc:mapping path="/hi"/>
          <ref bean="myInterceptor02"/>
      </mvc:interceptor>
  </mvc:interceptors>

這里我們定義了兩個(gè)攔截器myInterceptor01和myInterceptor02,兩個(gè)攔截器都會(huì)對(duì)ip:port/工程路徑/hi的請(qǐng)求進(jìn)行攔截,執(zhí)行結(jié)果如下圖所示:

執(zhí)行流程說(shuō)明:攔截器的執(zhí)行先后順序根據(jù)配置的先后順序執(zhí)行

3.主要事項(xiàng)和細(xì)節(jié)

  • 如果第 1 個(gè)攔截器的 preHandle() 返回 false , 后面都不在執(zhí)行
  • 如果第2個(gè) 攔 截 器 的 preHandle() 返 回 false , 就 直 接 執(zhí) 行 第1個(gè) 攔 截 器 的 afterCompletion()方法, 如果攔截器更多,規(guī)則類(lèi)似
  • 說(shuō)明: 前面說(shuō)的規(guī)則,都是目標(biāo)方法被攔截的前提

在實(shí)際開(kāi)發(fā)中我們常用攔截器對(duì)登錄進(jìn)行驗(yàn)證

到此這篇關(guān)于SpringMVC超詳細(xì)介紹自定義攔截器的文章就介紹到這了,更多相關(guān)SpringMVC攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot 統(tǒng)一請(qǐng)求返回的實(shí)現(xiàn)

    SpringBoot 統(tǒng)一請(qǐng)求返回的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot 統(tǒng)一請(qǐng)求返回的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • springcloud引入spring-cloud-starter-openfeign失敗的解決

    springcloud引入spring-cloud-starter-openfeign失敗的解決

    這篇文章主要介紹了springcloud?引入spring-cloud-starter-openfeign失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • RocketMQ特性Broker存儲(chǔ)事務(wù)消息實(shí)現(xiàn)

    RocketMQ特性Broker存儲(chǔ)事務(wù)消息實(shí)現(xiàn)

    這篇文章主要為大家介紹了RocketMQ特性Broker存儲(chǔ)事務(wù)消息實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Java中JSON字符串與java對(duì)象的互換實(shí)例詳解

    Java中JSON字符串與java對(duì)象的互換實(shí)例詳解

    這篇文章主要介紹了在java中,JSON字符串與java對(duì)象的相互轉(zhuǎn)換實(shí)例詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • java實(shí)現(xiàn)遠(yuǎn)程連接執(zhí)行命令行與上傳下載文件

    java實(shí)現(xiàn)遠(yuǎn)程連接執(zhí)行命令行與上傳下載文件

    這篇文章主要介紹了java實(shí)現(xiàn)遠(yuǎn)程連接執(zhí)行命令行與上傳下載文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spark調(diào)優(yōu)多線程并行處理任務(wù)實(shí)現(xiàn)方式

    Spark調(diào)優(yōu)多線程并行處理任務(wù)實(shí)現(xiàn)方式

    這篇文章主要介紹了Spark調(diào)優(yōu)多線程并行處理任務(wù)實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java中Map集合的常用方法總結(jié)大全

    java中Map集合的常用方法總結(jié)大全

    開(kāi)發(fā)中最常用的就是List集合和Map集合,Map集合是基于java核心類(lèi)java.util中的,下面這篇文章主要給大家總結(jié)介紹了關(guān)于java中Map集合的一些常用方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 詳解SpringBoot開(kāi)發(fā)案例之整合Dubbo分布式服務(wù)

    詳解SpringBoot開(kāi)發(fā)案例之整合Dubbo分布式服務(wù)

    這篇文章主要介紹了詳解SpringBoot開(kāi)發(fā)案例之整合Dubbo分布式服務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Spring Bean常用依賴注入方式詳解

    Spring Bean常用依賴注入方式詳解

    這篇文章主要介紹了Spring Bean常用三種依賴注入方式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot?使用?Sa-Token?完成注解鑒權(quán)功能(權(quán)限校驗(yàn))

    SpringBoot?使用?Sa-Token?完成注解鑒權(quán)功能(權(quán)限校驗(yàn))

    Sa-Token?是一個(gè)輕量級(jí)?java?權(quán)限認(rèn)證框架,主要解決登錄認(rèn)證、權(quán)限認(rèn)證、單點(diǎn)登錄、OAuth2、微服務(wù)網(wǎng)關(guān)鑒權(quán)?等一系列權(quán)限相關(guān)問(wèn)題,這篇文章主要介紹了SpringBoot使用Sa-Token完成注解鑒權(quán)功能,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

双流县| 大余县| 唐山市| 西峡县| 青河县| 尉犁县| 中西区| 海丰县| 莫力| 昔阳县| 石门县| 通河县| 阳朔县| 娄底市| 那坡县| 葵青区| 苍溪县| 龙州县| 如皋市| 清水河县| 枣强县| 红原县| 藁城市| 峨眉山市| 翁源县| 特克斯县| 游戏| 神农架林区| 梁山县| 巴青县| 景宁| 肇庆市| 澄城县| 喀喇| 嵊泗县| 新野县| 靖远县| 兴化市| 东台市| 海伦市| 阳原县|