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

Spring的攔截器HandlerInterceptor詳解

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

1 什么是攔截器

攔截器是相對于Spring中來說的,它和過濾器不一樣,過濾器的范圍更廣一些是相對于Tomcat容器來說的。攔截器可以對用戶進行攔截過濾處理。

但是并不是說攔截器只對請求進入Controller控制器之前起作用,它也分為3個部分:

  • 請求進入Controller之前,通過攔截器執(zhí)行代碼邏輯
  • Controller執(zhí)行之后(只是Controller執(zhí)行完畢,視圖還沒有開始渲染),通過攔截器執(zhí)行代碼邏輯
  • Controller完全執(zhí)行完畢(整個請求全部結(jié)束),通過攔截器執(zhí)行代碼邏輯

2HandlerInterceptor和WebMvcConfigurer

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

2.1HandlerInterceptor

作用:自定義攔截器

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

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:此方法的作用是在請求進入到Controller進行攔截,有返回值。(返回true則將請求放行進入Controller控制層,false則請求結(jié)束返回錯誤信息)

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

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

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

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

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

2.2WebMvcConfigurer

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

如何創(chuàng)建:自定義一個類,實現(xiàn)WebMvcConfigurer并將它注入到Spring容器中。根據(jù)需求實現(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)資源路徑,即某些請求需要讀取某個路徑下的靜態(tài)資源內(nèi)容,需要配置該靜態(tài)資源的路徑,通過該方法可以統(tǒng)一給這些請求配置指定靜態(tài)資源路徑

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

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

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

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

2)自定義類實現(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("/**") //所有的請求都要攔截。
                .excludePathPatterns(patterns); //將不需要攔截的接口請求排除在外
    }
    /**
     * //下面代碼意思是:配置一個攔截器,如果訪問路徑時addResourceHandler中的這個路徑(我這里是/**表示所有的路徑),
     *  那么就映射到訪問本地的addResourceLocations這個路徑上,這樣就可以看到該路徑上的資源了
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**") //配置需要添加靜態(tài)資源請求的url
                .addResourceLocations("classpath:/pic/"); //配置靜態(tài)資源路徑
    }
}

3)測試類

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

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

猜驗證1:

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

/login/login 請求正常訪問,但不會進入攔截器,故控制臺不會打印攔截器中的輸出語句。

驗證2:

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

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

/test/other請求正常訪問,會進入攔截器,控制臺會打印攔截器中的輸出語句。

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

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

相關(guān)文章

  • Java消息隊列RabbitMQ之消息模式詳解

    Java消息隊列RabbitMQ之消息模式詳解

    這篇文章主要介紹了Java消息隊列RabbitMQ之消息模式詳解,RabbitMQ提供了一種qos(服務(wù)質(zhì)量保證)功能,即在非自動確認(rèn)消息的前提下,如果一定數(shù)目的消息(通過基于Consumer或者Channel設(shè)置Qos的值)未被確認(rèn)前,不進行消費新的消息,需要的朋友可以參考下
    2023-07-07
  • Spring Security基于過濾器實現(xiàn)圖形驗證碼功能

    Spring Security基于過濾器實現(xiàn)圖形驗證碼功能

    驗證碼就是為了防止惡意用戶采用暴力重試的攻擊手段而設(shè)置的一種防護措施,接下來在Spring Security的環(huán)境中,我們可以用兩種方案實現(xiàn)圖形驗證碼,具體實現(xiàn)方法跟隨小編一起看看吧
    2021-09-09
  • JAVA熔斷和降級真實關(guān)系的圖文詳解

    JAVA熔斷和降級真實關(guān)系的圖文詳解

    這篇文章主要介紹了Java熔斷和降級的關(guān)系,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • SpringData JPA快速上手之關(guān)聯(lián)查詢及JPQL語句書寫詳解

    SpringData JPA快速上手之關(guān)聯(lián)查詢及JPQL語句書寫詳解

    JPA都有SpringBoot的官方直接提供的starter,而Mybatis沒有,直到SpringBoot 3才開始加入到官方模版中,這篇文章主要介紹了SpringData JPA快速上手,關(guān)聯(lián)查詢,JPQL語句書寫的相關(guān)知識,感興趣的朋友一起看看吧
    2023-09-09
  • Java Annotation注解相關(guān)原理代碼總結(jié)

    Java Annotation注解相關(guān)原理代碼總結(jié)

    這篇文章主要介紹了Java Annotation注解相關(guān)原理代碼總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Kotlin教程之函數(shù)和包的定義和流程控制

    Kotlin教程之函數(shù)和包的定義和流程控制

    這篇文章主要介紹了Kotlin教程之函數(shù)和包的定義和流程控制的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • java巧用@Convert實現(xiàn)表字段自動轉(zhuǎn)entity

    java巧用@Convert實現(xiàn)表字段自動轉(zhuǎn)entity

    本文主要介紹了java巧用@Convert實現(xiàn)表字段自動轉(zhuǎn)entity,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 在Java中使用OpenCV實踐

    在Java中使用OpenCV實踐

    用戶分享了在Java項目中集成OpenCV4.10.0的實踐經(jīng)驗,涵蓋庫簡介、Windows安裝、依賴配置及灰度圖測試,強調(diào)其在圖像處理領(lǐng)域的多功能性,并計劃后續(xù)探索AI結(jié)合應(yīng)用
    2025-07-07
  • 解決JDK8的ParallelStream遍歷無序的問題

    解決JDK8的ParallelStream遍歷無序的問題

    這篇文章主要介紹了解決JDK8的ParallelStream遍歷無序的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java單鏈表的實現(xiàn)代碼

    Java單鏈表的實現(xiàn)代碼

    這篇文章主要介紹了Java單鏈表的實現(xiàn)代碼的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07

最新評論

玛曲县| 偃师市| 托克逊县| 兴山县| 远安县| 泰和县| 宁安市| 禄劝| 图们市| 长春市| 彰化市| 车致| 古浪县| 石嘴山市| 谢通门县| 南召县| 平泉县| 乌恰县| 大田县| 房产| 阳谷县| 永丰县| 礼泉县| 仪陇县| 七台河市| 屏东县| 横峰县| 苗栗市| 涟水县| 黔西县| 保亭| 沧源| 全州县| 乃东县| 清苑县| 睢宁县| 高要市| 温泉县| 南和县| 泗洪县| 东阳市|