欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring的攔截器HandlerInterceptor詳解

 更新時(shí)間:2024年01月30日 10:42:39   作者:想養(yǎng)一只薩摩耶~  
這篇文章主要介紹了Spring的攔截器HandlerInterceptor詳解,攔截器是相對(duì)于Spring中來(lái)說(shuō)的,它和過(guò)濾器不一樣,過(guò)濾器的范圍更廣一些是相對(duì)于Tomcat容器來(lái)說(shuō)的,攔截器可以對(duì)用戶進(jìn)行攔截過(guò)濾處理,需要的朋友可以參考下

1 什么是攔截器

攔截器是相對(duì)于Spring中來(lái)說(shuō)的,它和過(guò)濾器不一樣,過(guò)濾器的范圍更廣一些是相對(duì)于Tomcat容器來(lái)說(shuō)的。攔截器可以對(duì)用戶進(jìn)行攔截過(guò)濾處理。

但是并不是說(shuō)攔截器只對(duì)請(qǐng)求進(jìn)入Controller控制器之前起作用,它也分為3個(gè)部分:

  • 請(qǐng)求進(jìn)入Controller之前,通過(guò)攔截器執(zhí)行代碼邏輯
  • Controller執(zhí)行之后(只是Controller執(zhí)行完畢,視圖還沒(méi)有開(kāi)始渲染),通過(guò)攔截器執(zhí)行代碼邏輯
  • Controller完全執(zhí)行完畢(整個(gè)請(qǐng)求全部結(jié)束),通過(guò)攔截器執(zhí)行代碼邏輯

2HandlerInterceptor和WebMvcConfigurer

想要自己配置一個(gè)攔截器,就必須用到HandlerInterceptor和WebMvcConfigurer這兩個(gè)接口。

2.1HandlerInterceptor

作用:自定義攔截器

如何創(chuàng)建:這個(gè)接口我們通常會(huì)自定義一個(gè)類。加上@Component注解,并且使它實(shí)現(xiàn)HandlerInterceptor接口(根據(jù)需求重寫(xiě)里面的三個(gè)方法)

HandlerInterceptor源碼如下:

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}
  • preHandle:此方法的作用是在請(qǐng)求進(jìn)入到Controller進(jìn)行攔截,有返回值。(返回true則將請(qǐng)求放行進(jìn)入Controller控制層,false則請(qǐng)求結(jié)束返回錯(cuò)誤信息)

用法:登錄驗(yàn)證(判斷用戶是否登錄)權(quán)限驗(yàn)證:判斷用戶是否有權(quán)訪問(wèn)資源(校驗(yàn)token)

  • postHandle:該方法是在Controller控制器執(zhí)行完成但是還沒(méi)有返回模板進(jìn)行渲染攔截。沒(méi)有返回值。就是Controller----->攔截------>ModelAndView。

用法:因此我們可以將Controller層返回來(lái)的參數(shù)進(jìn)行一些修改,它就包含在ModelAndView中,所以該方法多了一個(gè)ModelAndView參數(shù)。

  • afterCompletion:該方法是在ModelAndView返回給前端渲染后執(zhí)行。

用法:例如登錄的時(shí)候,我們經(jīng)常把用戶信息放到ThreadLocal中,為了防止內(nèi)存泄漏,就需要將其remove掉,該操作就是在這里執(zhí)行的。

2.2WebMvcConfigurer

作用:添加攔截規(guī)則

如何創(chuàng)建:自定義一個(gè)類,實(shí)現(xiàn)WebMvcConfigurer并將它注入到Spring容器中。根據(jù)需求實(shí)現(xiàn)里面方法。

WebMvcConfigurer源碼如下:

public interface WebMvcConfigurer {
    default void configurePathMatch(PathMatchConfigurer configurer) {
    }
    default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    }
    default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
    }
    default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    }
    default void addFormatters(FormatterRegistry registry) {
    }
    default void addInterceptors(InterceptorRegistry registry) {
    }
    default void addResourceHandlers(ResourceHandlerRegistry registry) {
    }
    default void addCorsMappings(CorsRegistry registry) {
    }
    default void addViewControllers(ViewControllerRegistry registry) {
    }
    default void configureViewResolvers(ViewResolverRegistry registry) {
    }
    default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    }
    default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
    }
    default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    }
    default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    }
    default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }
    default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }
    @Nullable
    default Validator getValidator() {
        return null;
    }
    @Nullable
    default MessageCodesResolver getMessageCodesResolver() {
        return null;
    }
}

根據(jù)源碼發(fā)現(xiàn),這里面有很多方法,但是通常我們只用到了里面的兩種方法如下:

addInterceptors:添加攔截器,攔截器需要攔截的路徑和需要排除攔截的路徑都需要在其中配置

addResourceHandlers:配置靜態(tài)資源路徑,即某些請(qǐng)求需要讀取某個(gè)路徑下的靜態(tài)資源內(nèi)容,需要配置該靜態(tài)資源的路徑,通過(guò)該方法可以統(tǒng)一給這些請(qǐng)求配置指定靜態(tài)資源路徑

3 攔截器實(shí)現(xiàn)流程

根據(jù)第二部分,我們知道了配置攔截器的準(zhǔn)備工作。

1)自定義類實(shí)現(xiàn)HandlerInterceptor

@Component
public class HeaderInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("進(jìn)入攔截器=======執(zhí)行前========");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("進(jìn)入攔截器=======執(zhí)行中========");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("進(jìn)入攔截器=======執(zhí)行后========");
    }
}

2)自定義類實(shí)現(xiàn)WebMvcConfigurer

package com.liubujun.springbootinterceptor.config;
import com.liubujun.springbootinterceptor.interceptor.HeaderInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
 * @Author: liubujun
 * @Date: 2022/10/10 19:55
 */
/**
 * 此處也可以繼承WebMvcConfigurationSupport
 */
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
    @Resource
    private HeaderInterceptor headerInterceptor;
    /**
     * 添加攔截規(guī)則
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        List<String> patterns = new ArrayList<>();
        patterns.add("/login/login");
        registry.addInterceptor(headerInterceptor)
                .addPathPatterns("/**") //所有的請(qǐng)求都要攔截。
                .excludePathPatterns(patterns); //將不需要攔截的接口請(qǐng)求排除在外
    }
    /**
     * //下面代碼意思是:配置一個(gè)攔截器,如果訪問(wèn)路徑時(shí)addResourceHandler中的這個(gè)路徑(我這里是/**表示所有的路徑),
     *  那么就映射到訪問(wèn)本地的addResourceLocations這個(gè)路徑上,這樣就可以看到該路徑上的資源了
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**") //配置需要添加靜態(tài)資源請(qǐng)求的url
                .addResourceLocations("classpath:/pic/"); //配置靜態(tài)資源路徑
    }
}

3)測(cè)試類

@RestController
public class LoginController {
 
 
    @GetMapping("/login/login")
    public String testLoginInterceptor(){
        return "登錄請(qǐng)求沒(méi)有被攔截====》看控制臺(tái)沒(méi)有輸出";
    }
 
    @GetMapping("/test/other")
    public String testOtherInterceptor(){
        return "該請(qǐng)求沒(méi)有被攔截,看控制臺(tái)有輸出";
    }
}

4)本地添加靜態(tài)資源

猜驗(yàn)證1:

由于在配置攔截規(guī)則中,攔截了所有請(qǐng)求,但是排除了登錄請(qǐng)求,所以

/login/login 請(qǐng)求正常訪問(wèn),但不會(huì)進(jìn)入攔截器,故控制臺(tái)不會(huì)打印攔截器中的輸出語(yǔ)句。

驗(yàn)證2:

由于在配置攔截規(guī)則

由于在配置攔截規(guī)則中,攔截了所有請(qǐng)求,但是排除了登錄請(qǐng)求,所以

/test/other請(qǐng)求正常訪問(wèn),會(huì)進(jìn)入攔截器,控制臺(tái)會(huì)打印攔截器中的輸出語(yǔ)句。

驗(yàn)證3:攔截器中配置了映射靜態(tài)資源路徑,所以可以訪問(wèn)到自己上傳到本地服務(wù)器的圖片。

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

相關(guān)文章

  • 實(shí)體類或?qū)ο笮蛄谢瘯r(shí),忽略為空屬性的操作

    實(shí)體類或?qū)ο笮蛄谢瘯r(shí),忽略為空屬性的操作

    這篇文章主要介紹了實(shí)體類或?qū)ο笮蛄谢瘯r(shí),忽略為空屬性的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java線程池ForkJoinPool實(shí)例解析

    Java線程池ForkJoinPool實(shí)例解析

    這篇文章主要介紹了Java線程池ForkJoinPool實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 淺析Java迭代器Iterator和Iterable的區(qū)別

    淺析Java迭代器Iterator和Iterable的區(qū)別

    Java語(yǔ)言中,Iterator和Iterable都是用來(lái)遍歷集合類數(shù)據(jù)結(jié)構(gòu)的接口,雖然它們有很多相似的地方,但在具體實(shí)現(xiàn)中卻有著一些不同之處,本文將詳細(xì)分析它們的區(qū)別,并提供相應(yīng)的代碼示例,需要的朋友可以參考下
    2023-07-07
  • springboot實(shí)現(xiàn)防重復(fù)提交和防重復(fù)點(diǎn)擊的示例

    springboot實(shí)現(xiàn)防重復(fù)提交和防重復(fù)點(diǎn)擊的示例

    這篇文章主要介紹了springboot實(shí)現(xiàn)防重復(fù)提交和防重復(fù)點(diǎn)擊的示例,幫助大家更好的理解和學(xué)習(xí)springboot框架,感興趣的朋友可以了解下
    2020-09-09
  • SpringBoot中集成screw(螺絲釘)實(shí)現(xiàn)數(shù)據(jù)庫(kù)表結(jié)構(gòu)文檔生成方法

    SpringBoot中集成screw(螺絲釘)實(shí)現(xiàn)數(shù)據(jù)庫(kù)表結(jié)構(gòu)文檔生成方法

    這篇文章主要介紹了SpringBoot中集成screw(螺絲釘)實(shí)現(xiàn)數(shù)據(jù)庫(kù)表結(jié)構(gòu)文檔生成,下面以連接mysql數(shù)據(jù)庫(kù)并生成html格式的數(shù)據(jù)庫(kù)結(jié)構(gòu)文檔為例,插件的使用方式除可以使用代碼外,還可以使用Maven插件的方式,需要的朋友可以參考下
    2024-07-07
  • SpringBoot內(nèi)嵌tomcat處理有特殊字符轉(zhuǎn)義的問(wèn)題

    SpringBoot內(nèi)嵌tomcat處理有特殊字符轉(zhuǎn)義的問(wèn)題

    這篇文章主要介紹了SpringBoot內(nèi)嵌tomcat處理有特殊字符轉(zhuǎn)義的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java實(shí)現(xiàn)傾斜水印鋪滿整張圖

    java實(shí)現(xiàn)傾斜水印鋪滿整張圖

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)傾斜水印鋪滿整張圖的具體代碼,教大家如何控制水印之間的空隙,感興趣的小伙伴們可以參考一下
    2016-06-06
  • nexus私服啟動(dòng)不了問(wèn)題及解決

    nexus私服啟動(dòng)不了問(wèn)題及解決

    這篇文章主要介紹了nexus私服啟動(dòng)不了問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java基礎(chǔ)語(yǔ)法:邏輯控制

    Java基礎(chǔ)語(yǔ)法:邏輯控制

    下面小編就為大家?guī)?lái)一篇Java邏輯控制的基礎(chǔ)文章。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-08-08
  • 解讀classpath讀取resources目錄下的文件

    解讀classpath讀取resources目錄下的文件

    這篇文章主要介紹了解讀classpath讀取resources目錄下的文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評(píng)論