Spring MVC攔截器(Interceptor)的定義和配置過(guò)程
1、SpringMVC中組件: 攔截器(Interceptor)
攔截器(Interceptor)
對(duì)我們來(lái)說(shuō)是非常實(shí)用的,也是經(jīng)常使用的,可以在所有的HandlerMapping的前后進(jìn)行攔截,當(dāng)我們需要將特定功能應(yīng)用于符合某種規(guī)則的請(qǐng)求的時(shí)候,這個(gè)時(shí)候就可以使用攔截器。
我們自定義的攔截器必須繼承org.springframework.web.servlet.HandlerInterceptor,在HandlerInterceptor由三個(gè)默認(rèn)方法
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;
public interface HandlerInterceptor {
/**
* 在執(zhí)行實(shí)際儲(chǔ)器程序之前,根據(jù)返回的boolen判斷是否放行
*/
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
/**
* 執(zhí)行處理程序之后
*/
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
/**
* 在完成請(qǐng)求后
*/
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
自定義的攔截器
package com.example.web.interceptor;
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 {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
System.out.println("請(qǐng)求的路徑:" +requestURI);
long startTime = System.currentTimeMillis();
request.setAttribute("request::start",startTime);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
long startTime = (long)request.getAttribute("request::start");
long processEndTime = System.currentTimeMillis();
System.out.println("處理程序執(zhí)行完成耗時(shí):"+ (processEndTime-startTime) + "毫秒");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
long startTime = (long)request.getAttribute("request::start");
long endTime = System.currentTimeMillis();
System.out.println("從請(qǐng)求到完成響應(yīng)耗時(shí):"+ (endTime-startTime) + "毫秒");
}
}
2、攔截器(Interceptor)的配置
在自定攔截器完成后,就是在Spring MVC 中配置我們的攔截器(Interceptor)了,可以通過(guò)Java配置類的方式進(jìn)行配置,也可以通過(guò)xml文件的方式進(jìn)行配置。
先從Java配置類的方式來(lái)看
@EnableWebMvc: 表示啟用Spring MVC的功能@Configuration: 表示該類是Spring 中的配置類- 攔截的配置需要重寫
WebMvcConfigurer的addInterceptors(InterceptorRegistry registry)方法,通過(guò)registry進(jìn)行添加(默認(rèn)攔截所有) - 可以通過(guò)
addPathPatterns來(lái)表示攔截哪些請(qǐng)求 - 可以通過(guò)
excludePathPatterns不攔截哪些請(qǐng)求
對(duì)于URI匹配模式:
?:匹配一個(gè)字符*:匹配路徑段中的零個(gè)或者多個(gè)字符**:匹配零個(gè)或者多個(gè)路徑段
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
registry.addInterceptor(new LocaleChangeInterceptor());
registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
}
}在xml中進(jìn)行配置
<mvc:interceptors>
<bean class="com.example.web.interceptor.MyInterceptor"/>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/admin/**"/>
<bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/secure/*"/>
<bean class="org.example.SecurityInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)對(duì)視頻進(jìn)行截圖的方法【附ffmpeg下載】
這篇文章主要介紹了Java實(shí)現(xiàn)對(duì)視頻進(jìn)行截圖的方法,結(jié)合實(shí)例形式分析了Java使用ffmpeg針對(duì)視頻進(jìn)行截圖的相關(guān)操作技巧,并附帶ffmpeg.exe文件供讀者下載使用,需要的朋友可以參考下2018-01-01
Java使用Apache POI庫(kù)讀取Excel表格文檔的示例
POI庫(kù)是Apache提供的用于在Windows下讀寫各類微軟Office文檔的Java庫(kù),這里我們就來(lái)看一下Java使用Apache POI庫(kù)讀取Excel表格文檔的示例:2016-06-06
SpringCloud Ribbon負(fù)載均衡代碼實(shí)例
這篇文章主要介紹了SpringCloud Ribbon負(fù)載均衡代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Java?關(guān)鍵字break和continue的使用說(shuō)明
這篇文章主要介紹了Java?關(guān)鍵字break和continue的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
SpringBoot的jar包如何啟動(dòng)的實(shí)現(xiàn)
本文主要介紹了SpringBoot的jar包如何啟動(dòng)的實(shí)現(xiàn),文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Java基礎(chǔ)之?dāng)?shù)組模擬循環(huán)隊(duì)列
這篇文章主要介紹了Java基礎(chǔ)之?dāng)?shù)組模擬循環(huán)隊(duì)列,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們也有非常好的幫助,需要的朋友可以參考下2021-04-04
基于java語(yǔ)言實(shí)現(xiàn)快遞系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于java語(yǔ)言實(shí)現(xiàn)快遞系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
IDEA不能自動(dòng)導(dǎo)包的問(wèn)題及解決方案
這篇文章主要介紹了IDEA不能自動(dòng)導(dǎo)包的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2026-03-03
SpringBoot中靜態(tài)訪問(wèn)配置屬性的解決方案對(duì)比
在SpringBoot開發(fā)中,靜態(tài)訪問(wèn)配置信息是一個(gè)常見需求,尤其是在工具類中直接獲取配置值,下面我們就來(lái)看看幾個(gè)常用的方法,大家可以根據(jù)需要選擇2025-03-03

