攔截器概述
在Spring框架中,攔截器(Interceptor)是一種強(qiáng)大的機(jī)制,它允許開發(fā)者在請(qǐng)求處理的不同階段插入自定義邏輯。WebApplicationContext作為Spring Web應(yīng)用的上下文容器,為攔截器的配置和管理提供了基礎(chǔ)支持。
攔截器主要作用于以下場(chǎng)景:
權(quán)限驗(yàn)證
日志記錄
性能監(jiān)控
事務(wù)管理
通用行為注入等
攔截器與WebApplicationContext的關(guān)系
WebApplicationContext是Spring Web應(yīng)用的IoC容器擴(kuò)展,它繼承自ApplicationContext,并添加了Web應(yīng)用特有的功能。攔截器通過(guò)WebApplicationContext進(jìn)行注冊(cè)和管理,成為請(qǐng)求處理管道的一部分。
public interface WebApplicationContext extends ApplicationContext {
String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";
ServletContext getServletContext();
}
攔截器類型
HandlerInterceptor
最常用的攔截器接口,定義了三個(gè)關(guān)鍵方法:
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,
ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
}
}
AsyncHandlerInterceptor
HandlerInterceptor的擴(kuò)展,增加了異步處理的支持。
WebRequestInterceptor
與HandlerInterceptor類似,但提供了更通用的WebRequest抽象,不依賴于Servlet API。
攔截器配置
XML配置方式
Java配置方式
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggingInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/static/**");
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/admin/**");
}
}
注解方式
@Component
public class MyInterceptor implements HandlerInterceptor {
// 實(shí)現(xiàn)方法
}
@Configuration
public class InterceptorConfig {
@Autowired
private MyInterceptor myInterceptor;
@Bean
public WebMvcConfigurer adapter() {
return new WebMvcConfigurer() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor);
}
};
}
}
攔截器執(zhí)行流程
攔截器在DispatcherServlet的處理流程中扮演重要角色:
preHandle:在處理器執(zhí)行前調(diào)用
返回true繼續(xù)執(zhí)行
返回false中斷請(qǐng)求處理
postHandle:在處理器執(zhí)行后,視圖渲染前調(diào)用
可修改ModelAndView
afterCompletion:在完整請(qǐng)求完成后調(diào)用
適合資源清理

高級(jí)攔截器特性
攔截器順序控制
可以通過(guò)order屬性控制多個(gè)攔截器的執(zhí)行順序:
registry.addInterceptor(new InterceptorA()).order(1);
registry.addInterceptor(new InterceptorB()).order(2);
路徑匹配模式
支持Ant風(fēng)格的路徑模式:
? 匹配一個(gè)字符
匹配零個(gè)或多個(gè)字符
** 匹配零個(gè)或多個(gè)目錄
異步請(qǐng)求處理
對(duì)于異步請(qǐng)求,afterConcurrentHandlingStarted方法會(huì)被調(diào)用而不是postHandle和afterCompletion。
攔截器與過(guò)濾器的區(qū)別
特性 | 攔截器(Interceptor) | 過(guò)濾器(Filter) |
---|---|---|
容器依賴 | Spring容器 | Servlet容器 |
作用范圍 | Spring MVC處理的請(qǐng)求 | 所有進(jìn)入容器的請(qǐng)求 |
訪問(wèn)對(duì)象 | 可以訪問(wèn)Handler和方法信息 | 只能訪問(wèn)ServletRequest/Response |
執(zhí)行時(shí)機(jī) | 在DispatcherServlet內(nèi)部執(zhí)行 | 在DispatcherServlet外部執(zhí)行 |
依賴注入 | 支持 | 不支持 |
實(shí)際應(yīng)用示例
日志攔截器
public class LoggingInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
logger.info("Request URL: {} : Start Time={}",
request.getRequestURL(), startTime);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
long startTime = (Long) request.getAttribute("startTime");
long endTime = System.currentTimeMillis();
logger.info("Request URL: {} : End Time={} : Time Taken={}ms",
request.getRequestURL(), endTime, (endTime - startTime));
}
}
認(rèn)證攔截器
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
HttpSession session = request.getSession();
if (session.getAttribute("user") == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
DEMO實(shí)測(cè)效果
被攔截

未被攔截

-
Web
+關(guān)注
關(guān)注
2文章
1296瀏覽量
73015 -
容器
+關(guān)注
關(guān)注
0文章
521瀏覽量
22719 -
spring
+關(guān)注
關(guān)注
0文章
341瀏覽量
15563
發(fā)布評(píng)論請(qǐng)先 登錄
HarmonyOS實(shí)戰(zhàn)開發(fā)-如何在Navigation中完成路由攔截
什么是java spring
我想做一個(gè)號(hào)碼攔截器。面對(duì)面5米內(nèi)接收到對(duì)方的手機(jī)號(hào)碼。我也咨詢很多人,不是技
五指山回收發(fā)那科驅(qū)動(dòng)器回收三菱變頻器回收秀洲CPU模塊執(zhí)行器回收PLC
網(wǎng)絡(luò)組件axios可以在OpenHarmony上使用了
動(dòng)能攔截器六自由度仿真建模研究
springmvc 自定義攔截器實(shí)現(xiàn)未登錄用戶的攔截

汽車庫(kù)融融資監(jiān)控“五指山”
小米的“五指山”意圖擊敗余承東的華為終端+榮耀組合的寶具“雙截龍”
五指刮擦試驗(yàn)儀測(cè)試方法的概述及優(yōu)勢(shì)介紹
Spring認(rèn)證_什么是Spring GraphQL

Spring中用到了哪些設(shè)計(jì)模式

Spring MVC的工作原理是怎樣的
springboot過(guò)濾器和攔截器哪個(gè)先執(zhí)行
使用go語(yǔ)言實(shí)現(xiàn)一個(gè)grpc攔截器

評(píng)論