国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot自定義攔截器interceptor使用詳解

這篇具有很好參考價值的文章主要介紹了SpringBoot自定義攔截器interceptor使用詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Spring Boot攔截器Intercepter詳解

Intercepter是由Spring提供的Intercepter攔截器,主要應(yīng)用在日志記錄、權(quán)限校驗等安全管理方便。

使用過程

1.創(chuàng)建自定義攔截器,實現(xiàn)HandlerInterceptor接口,并按照要求重寫指定方法

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 {
    }
}

根據(jù)源碼可看出HandlerInterceptor接口提供了三個default方法,這三個方法作用不同,用戶想要自定義個一個指定攔截規(guī)則的攔截器,需要重寫其中一個或者多個方法,這三個方法作用如下:

  • perHandle:preHandle方法的作用是,當請求在進入controller之前攔截請求,對請求進行預(yù)處理,比如登錄驗證(cookie,token,referer)或者單點登錄cookie解析都可以在這方法中進行。該方法的返回值,如果返回true,表示放行至controller業(yè)務(wù)層,如果false,表示請求非法,結(jié)束請求并返回錯誤信息。
  • postHandler:postHandle方法是在請求被controller處理完但是還未傳遞到業(yè)務(wù)模板進行渲染攔截,即controller處理完,返回ModelAndView 之前執(zhí)行該方法,可以操控ModelAndView的值;所以該方法多了一個參數(shù),ModelAndView,這個參數(shù)包含了controller處理完后需要傳遞的Model參數(shù),因此,我們可以在該方法通過ModelAndView對象對返給前端的額視圖做一定的修改。
  • afterCompletion:afterCompletion方法作用就是做些收尾工作,在ModelAndView返回前端進行渲染后執(zhí)行,比如有時候我們需要把每個線程的局部變量(如User信息)放入到TheradLocal中,為了防止內(nèi)存泄露,在最后需要清除ThreadLocal的內(nèi)容,此操作就可以放在該方法中執(zhí)行。

自定義一個獲取并返回某個靜態(tài)資源的內(nèi)容已整個請求所花費時間的時間攔截器

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyInterceptor.class);

    private static final ThreadLocal<Long> START_THREAD_LOCAL = new ThreadLocal<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String uri = request.getRequestURI();
        LOGGER.info(uri + " preHandle");
        Long startTime = System.currentTimeMillis();    //獲取開始時間
        START_THREAD_LOCAL.set(startTime);  //線程綁定變量(該數(shù)據(jù)只有當前請求的線程可見)
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        String uri = request.getRequestURI();
        LOGGER.info(uri + " postHandle");
        Long startTime = START_THREAD_LOCAL.get();//得到線程綁定的局部變量(開始時間)
        Long endTime = System.currentTimeMillis(); 	//2、結(jié)束時間
        Long time = endTime - startTime;
        LOGGER.info("http request all time: " + time + "ms");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        String uri = request.getRequestURI();
        LOGGER.info(uri + " afterCompletion");
        if (START_THREAD_LOCAL != null) {
            START_THREAD_LOCAL.remove();    // 移除ThreadLocal中的局部變量
        }
    }
}
2.添加配置類,實現(xiàn)WebMvcController接口,并添加@Configuration注解,在配置類中,重寫addIntercepters方法,添加要攔截的url以及url白名單(需要排除攔截的url)

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ù)源碼可以看出,WebMvcConfigurer提供了多個方法,并且也都是default方法,也是根據(jù)我們自定義配置,重寫其中一個或者多個方法,這里就介紹兩個常用的方法:

  • addInterceptors:從該方法名就可以了解到該方法是添加攔截器,即將攔截器交給IOC去執(zhí)行,攔截器需要攔截的路徑以及需要排除攔截的路徑在該方法中配置。
  • addResourceHandlers:該方法的作用是配置靜態(tài)資源路徑。即某些請求需要讀取某個路徑下的靜態(tài)資源內(nèi)容,需要配置該靜態(tài)資源的路徑,通過該方法可以統(tǒng)一給這些請求配置指定靜態(tài)資源路徑?。

實例:

import com.eureka.intercrpotor.MyInterceptor;
import org.springframework.context.annotation.Bean;
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.WebMvcConfigurer;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Bean
    public MyInterceptor myInterceptor() {
        return new MyInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor())  // 添加攔截器
                .addPathPatterns("/**")          // 配置攔截請求url( ** 表示攔截所有請求url)
                .excludePathPatterns("/hello"); // 排除某些不需要攔截的請求url(即帶有/hello請求不會被攔截)
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")   // 配置需要添加靜態(tài)資源的請求url
                .addResourceLocations("classpath:/mydata/");   //配置靜態(tài)資源路徑
    }
}

測試:

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    
    @GetMapping("/test/interceptor")
    public ResponseEntity<String> testInterceptor() {
        return ResponseEntity.ok("successful");
    }
}

靜態(tài)資源:

SpringBoot自定義攔截器interceptor使用詳解,spring boot,java,spring

?啟動項目后訪問 localhost:60011/test/interceptor:

SpringBoot自定義攔截器interceptor使用詳解,spring boot,java,spring

?控制臺打印的日志:

SpringBoot自定義攔截器interceptor使用詳解,spring boot,java,spring

?我們再通過url訪問靜態(tài)資源請求 localhost:60011/test.jpg

SpringBoot自定義攔截器interceptor使用詳解,spring boot,java,spring文章來源地址http://www.zghlxwxcb.cn/news/detail-643364.html

到了這里,關(guān)于SpringBoot自定義攔截器interceptor使用詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 7.5 SpringBoot 攔截器Interceptor實戰(zhàn) 統(tǒng)一角色權(quán)限校驗

    7.5 SpringBoot 攔截器Interceptor實戰(zhàn) 統(tǒng)一角色權(quán)限校驗

    在【 7.1 】管理員圖書錄入和修改API,當時預(yù)告過:并沒有寫【校驗是否是管理員】的邏輯,因為是通用邏輯,會單寫一篇來細講,那么今天就來安排! 角色權(quán)限校驗 ,是保證接口安全必備的能力:有權(quán)限才可以操作!所以,一般對于這種通用邏輯,推薦不與主業(yè)務(wù)邏輯耦合

    2024年02月16日
    瀏覽(19)
  • 詳解過濾器Filter和攔截器Interceptor的區(qū)別和聯(lián)系

    詳解過濾器Filter和攔截器Interceptor的區(qū)別和聯(lián)系

    目錄 前言 區(qū)別 聯(lián)系 過濾器(Filter)和攔截器(Interceptor)都是用于在Web應(yīng)用程序中處理請求和響應(yīng)的組件,但它們在實現(xiàn)方式和功能上有一些區(qū)別。 1. 實現(xiàn)方式: - 過濾器是基于Servlet規(guī)范的組件,通過實現(xiàn) javax.servlet.Filter接口 來定義。過濾器可以在請求被處理之前和響應(yīng)被發(fā)送

    2024年02月11日
    瀏覽(25)
  • 一文詳解過濾器Filter、攔截器Interceptor和切面Aspect的區(qū)別

    一文詳解過濾器Filter、攔截器Interceptor和切面Aspect的區(qū)別

    目錄 Filter過濾器 作用 應(yīng)用場景 攔截器Interceptor Aspect切片 三者對比 執(zhí)行順序 攔截層面 過濾器Filter和攔截器Interceptor的區(qū)別 Filter 過濾器它是 JavaWeb 的三大組件之一 三大組件分別是:Servlet 程序、Listener 監(jiān)聽器、Filter 過濾器 Filter 過濾器它是 JavaEE 的規(guī)范 Filter隨web應(yīng)用的啟動

    2024年02月04日
    瀏覽(38)
  • Spring MVC攔截器Interceptor使用(判斷用戶登錄)

    Spring MVC攔截器Interceptor使用(判斷用戶登錄)

    Spring MVC中的攔截器(Interceptor)類似于Servlet中的過濾器(Filter),它主要用于攔截用戶請求并作相應(yīng)的處理。例如通過攔截器可以進行權(quán)限驗證、記錄請求信息的日志、判斷用戶是否登錄等。 攔截器可以在進入處理器之前做一些操作,或者在處理器完成后進行操作,甚至是

    2024年02月09日
    瀏覽(33)
  • interceptor攔截器框架

    在實際開發(fā)中,我們可能需要攔截部分請求進行一些額外的處理,比如校驗用戶權(quán)限、記錄請求日志等。而在Spring Boot中,使用攔截器(Interceptors)可以很方便地對請求進行攔截處理。 首先需要定義一個攔截器,通常需要實現(xiàn)HandlerInterceptor接口,并重寫其中的方法: java @Co

    2023年04月16日
    瀏覽(34)
  • SpringMVC攔截器 (Interceptor)

    ????????Spring MVC中的攔截器(Interceptor)類似于Servlet中的過濾器(Filter),它主要用于攔截用戶請求并作相應(yīng)的處理。例如通過攔截器可以進行權(quán)限驗證、判斷用戶是否登錄等。 ????????攔截器依賴于web框架,在實現(xiàn)上基于Java的反射機制,屬于面向切面編程(AOP)的

    2024年01月22日
    瀏覽(34)
  • SpringMVC的攔截器(Interceptor)

    SpringMVC的攔截器(Interceptor)

    對于攔截器這節(jié)的知識,我們需要學(xué)習如下內(nèi)容: 攔截器概念 入門案例 攔截器參數(shù) 攔截器工作流程分析 講解攔截器的概念之前,我們先看一張圖: (1)瀏覽器發(fā)送一個請求會先到Tomcat的web服務(wù)器 (2)Tomcat服務(wù)器接收到請求以后,會去判斷請求的是靜態(tài)資源還是動態(tài)資源 (3)如果是

    2024年02月09日
    瀏覽(30)
  • C# 12 攔截器 Interceptors

    C# 12 攔截器 Interceptors

    攔截器Interceptors是一種可以在編譯時以聲明方式替換原有應(yīng)用的方法。 這種替換是通過讓Interceptors聲明它攔截的調(diào)用的源位置來實現(xiàn)的。 您可以使用攔截器作為源生成器的一部分進行修改,而不是向現(xiàn)有源編譯添加代碼。 ? 演示 使用 .NET 8 創(chuàng)建一個控制臺應(yīng)用程序。并在

    2024年03月20日
    瀏覽(25)
  • 過濾器Filter,攔截器Interceptor

    過濾器Filter,攔截器Interceptor

    過濾器Filter 快速入門 ? 詳情 登錄校驗-Filter 攔截器Interceptor 簡介快速入門 定義攔截器 配置攔截器 詳解(攔截路徑,執(zhí)行流程) 登錄校驗-Interceptor

    2024年02月07日
    瀏覽(31)
  • springboot在自定義攔截器中使用@Value獲取值失敗及@RefreshScope 不生效問題

    @RefreshScope注解用于標識在服務(wù)配置中心配置更新時,當前 Bean 需要重新注入以獲取最新的配置值。但是在這段代碼中,@RefreshScope注解標注在攔截器類上,并不會使攔截器實例重新注入。 通常情況下,攔截器是在應(yīng)用程序啟動時由 Spring Framework 實例化和初始化的,而不是在請

    2024年02月04日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包