真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

【SpringMVC】下篇,攔截器(一步到位學(xué)會(huì)它)-創(chuàng)新互聯(lián)

?作者簡(jiǎn)介:熱愛Java后端開發(fā)的一名學(xué)習(xí)者,大家可以跟我一起討論各種問題喔。
🍎個(gè)人主頁(yè):Hhzzy99
🍊個(gè)人信條:堅(jiān)持就是勝利!
💞當(dāng)前專欄:【Spring】
🥭本文內(nèi)容:SpringMVC的后半部分內(nèi)容-攔截器

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)舟曲,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575
SpringMVC

文章目錄
  • SpringMVC
  • 前言
  • 攔截器概述
    • 攔截器的定義
    • 攔截器的配置
  • 攔截器的執(zhí)行流程
    • 單個(gè)攔截器的執(zhí)行流程
    • 多個(gè)攔截器的執(zhí)行流程
  • 結(jié)語(yǔ)


前言

在上一篇文章中講完了SpringMVC的大部分知識(shí),此篇文章中主要講解攔截器。上一篇文章🚩
攔截器的使用是非常普遍的。例如在 OA系統(tǒng)中通過(guò)攔截器可以攔截未登錄的用戶,或者使用它來(lái)驗(yàn)證己登錄用戶是否有相應(yīng)的操作權(quán)限等。SpringMVC中提供了攔截器功能,通過(guò)配置即可對(duì)請(qǐng)求進(jìn)行攔截處理。


攔截器概述

SpringMVC 中的攔截器 (Interceptor)類似于 Servlet 中的過(guò)濾器(Filter),它主要用于攔截用戶請(qǐng)求并做相應(yīng)的處理。例如通過(guò)攔截器可以進(jìn)行權(quán)限驗(yàn)證、判斷用戶是否己登錄等。

攔截器的定義

要使用SpringMVC中的攔截器,就需要對(duì)攔截器類進(jìn)行定義和配置。通常攔截器類可以通過(guò)兩種方式來(lái)定義:

  • 一種是通過(guò)實(shí)現(xiàn)HandlerInterceptor接口或者繼承HandlerInterceptor接口的實(shí)現(xiàn)類(如HandlerInterceptorAdapter)來(lái)定義。
  • 另一種是通過(guò)實(shí)現(xiàn)WebRequestInterceptor接口或繼承WebRequestInterceptor接口的實(shí)現(xiàn)類來(lái)定義。

實(shí)現(xiàn)HandlerInterceptor接口的定義方式為例,自定義攔截器類的代碼如下所示:

public class UserInterceptor implements HandlerInterceptor {public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {System.out.println("UserInterceptor...preHandle");
        //對(duì)攔截的請(qǐng)求進(jìn)行放行處理(true為放行,false為不放行)
        return true;
    }

    public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("UserInterceptor...postHandle");

    }

    public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("UserInterceptor...afterCompletion");
    }
}

從上述代碼可以看出,自定義的攔截器類實(shí)現(xiàn)了HandlerInterceptor接口,并實(shí)現(xiàn)了接口中的3 個(gè)方法。關(guān)于這3個(gè)方法的具體描述如下:

  • preHandle()方法:該方法會(huì)在控制器方法前執(zhí)行,其返回值表示是否中斷后續(xù)操作。當(dāng)其返回值為true時(shí),表示繼續(xù)向下執(zhí)行; 當(dāng)其返回值為false時(shí),會(huì)中斷后續(xù)的所有操作(包括調(diào)用下一個(gè)攔截器和控制器類中的方法執(zhí)行等)。
  • postHandle()方法:該方法會(huì)在控制器方法調(diào)用之后,且解析視圖之前執(zhí)行。可以通過(guò)此方法對(duì)請(qǐng)求域中的模型和視圖做出進(jìn)一步的修改。
  • afterCompletion()方法:該方法在整個(gè)請(qǐng)求完成,即視圖渲染結(jié)束之后執(zhí)行??梢酝ㄟ^(guò)此方法實(shí)現(xiàn)一些資源清理、記錄日志信息等工作。
攔截器的配置

要使自定義的攔截器類生效,需要在SpringMVC的配置文件中進(jìn)行配置,配置代碼如下:

......

在上述代碼中,元素用于配置一組攔截器,其子元素中定義的是全局?jǐn)r截器,它會(huì)攔截所有的請(qǐng)求;而元素中定義的是指定路徑的攔截器,它會(huì)對(duì)指定路徑下的請(qǐng)求生效。<mvc:interceptor>元素的子元素用于配置攔截器作用的路徑,該路徑在其屬性path中定義。如上述代碼中path的屬性值“/**”表示攔截所有路徑,“/hello”表示攔截所有以“hello”結(jié)尾的路徑。如果在請(qǐng)求路徑中包含不需要攔截的內(nèi)容,還可以通過(guò)元素進(jìn)行配置。

攔截器的執(zhí)行流程

攔截器的執(zhí)行是有一定順序的,該順序與配置文件中所定義的攔截器的順序相關(guān)。

單個(gè)攔截器的執(zhí)行流程

如果在項(xiàng)目中只定義了一個(gè)攔截器,那么該攔截器在程序中的執(zhí)行流程如下圖所示。從中可以看出,程序首先會(huì)執(zhí)行攔截器類中的preHandle()方法,如果該方法的返回值為true,則程序就會(huì)繼續(xù)向下執(zhí)行處理器中的方法,否則將不再向下執(zhí)行:在業(yè)務(wù)處理器(即控制器Controller類)處理完請(qǐng)求后,會(huì)執(zhí)行postHandle()方法,然后通過(guò)DispatcherServlet向客戶端返回響應(yīng);在DispatcherServlet處理完請(qǐng)求后,才會(huì)執(zhí)行afterCompletion()方法。
單個(gè)攔截器
簡(jiǎn)單的案例
web.xml中配置SpringMVC的前端過(guò)濾器和初始化加載配置文件等信息。

spring-mvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:springmvc-config.xml1spring-mvc/

在src下創(chuàng)建com.hzy.controller包,并在里面創(chuàng)建控制器類HelloController,

@Controller
public class HelloController {@RequestMapping("/hello")
    public String hello(){System.out.println("Hello");
        return "success";
    }
}

在src下創(chuàng)建com.hzy.interceptor包,并在里面創(chuàng)建攔截器類UserInterceptor,該類需要實(shí)現(xiàn)HandlerInterceptor接口。

public class UserInterceptor implements HandlerInterceptor {public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {System.out.println("UserInterceptor...preHandle");
        //對(duì)攔截的請(qǐng)求進(jìn)行放行處理(true為放行,false為不放行)
        return true;
    }

    public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("UserInterceptor...postHandle");

    }

    public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("UserInterceptor...afterCompletion");
    }
}

在resources目錄下創(chuàng)建springmvc-config.xml

在WEB-INF目錄下創(chuàng)建一個(gè)jsp文件夾,并在里面創(chuàng)建一個(gè)頁(yè)面文件success.jsp,然后在里面顯示任意信息。發(fā)布并啟動(dòng)項(xiàng)目,訪問http://localhost:8080/springMvc_SSM/hello(注意你的訪問路徑可能和我不一樣哦)
結(jié)果:
在這里插入圖片描述
控制臺(tái)
在這里插入圖片描述

多個(gè)攔截器的執(zhí)行流程

在大型項(xiàng)目中,通常會(huì)定義很多攔截器來(lái)實(shí)現(xiàn)不同的功能。多個(gè)攔截器的執(zhí)行順序如圖所示。這里假設(shè)有兩個(gè)攔截器Interceptor1Interceptor2,并且在配置文件中,Interceptor1攔截器配置在前。
在這里插入圖片描述
從圖上可以看出,當(dāng)有多個(gè)攔截器同時(shí)工作時(shí),它們的preHandle()方法會(huì)按照配置文件中攔截器的配置順序執(zhí)行,而它們的postHandle()方法和afterCompletion()方法則會(huì)按照配置順序的反序執(zhí)行。
下為了驗(yàn)證上述描述,下面就修改上面的代碼來(lái)演示多個(gè)攔截器的執(zhí)行。
在com.hzy.interceptor包中創(chuàng)建兩個(gè)攔截器類Interceptor1和Interceptor2。
Interceptor1.java

public class Interceptor1 implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Interceptor1...preHandle");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Interceptor1...postHandle");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("Interceptor1...afterCompletion");
    }
}

Interceptor2.java

public class Interceptor2 implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Interceptor2...preHandle");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Interceptor2...postHandle");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("Interceptor2...afterCompletion");
    }
}

springmvc-config.xml

上述攔截器的配置代碼中,第一個(gè)攔截器會(huì)作用于所有路徑下的請(qǐng)求,而第二個(gè)攔截器會(huì)作用于“/hello”結(jié)尾的請(qǐng)求。運(yùn)行項(xiàng)目得到結(jié)果:
頁(yè)面輸出跟前面一樣。
控制臺(tái)輸出:
在這里插入圖片描述
從圖中可以看出,程序先執(zhí)行了前面兩個(gè)攔截器類中的preHandle()方法,這兩個(gè)方法的執(zhí)行順序與配置文件中定義的順序相同;然后執(zhí)行了控制器中類中的hello()方法;最后執(zhí)行了兩個(gè)攔截器類中的postHandle()方法和afterCompletion()方法,且這兩個(gè)方法的執(zhí)行順序與配置文件中所定義的攔截器順序相反。


結(jié)語(yǔ)

以上就是今天要講的內(nèi)容,主要是對(duì)上一篇文章的補(bǔ)充,攔截器的詳細(xì)講解,希望大家有所收獲。

如果各位大哥大姐對(duì)我所寫的內(nèi)容覺得還行的話,希望可以點(diǎn)個(gè)關(guān)注,點(diǎn)個(gè)收藏,您的支持就是我大的動(dòng)力,非常感謝您的閱讀(?′?`?)

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


本文標(biāo)題:【SpringMVC】下篇,攔截器(一步到位學(xué)會(huì)它)-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://weahome.cn/article/jheds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部