Spring MVC攔截器(Interceptor)的定義和配置過程
1、SpringMVC中組件: 攔截器(Interceptor)
攔截器(Interceptor)
對我們來說是非常實用的,也是經常使用的,可以在所有的HandlerMapping的前后進行攔截,當我們需要將特定功能應用于符合某種規(guī)則的請求的時候,這個時候就可以使用攔截器。
我們自定義的攔截器必須繼承org.springframework.web.servlet.HandlerInterceptor,在HandlerInterceptor由三個默認方法
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í)行實際儲器程序之前,根據(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 {
}
/**
* 在完成請求后
*/
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("請求的路徑:" +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í)行完成耗時:"+ (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("從請求到完成響應耗時:"+ (endTime-startTime) + "毫秒");
}
}
2、攔截器(Interceptor)的配置
在自定攔截器完成后,就是在Spring MVC 中配置我們的攔截器(Interceptor)了,可以通過Java配置類的方式進行配置,也可以通過xml文件的方式進行配置。
先從Java配置類的方式來看
@EnableWebMvc: 表示啟用Spring MVC的功能@Configuration: 表示該類是Spring 中的配置類- 攔截的配置需要重寫
WebMvcConfigurer的addInterceptors(InterceptorRegistry registry)方法,通過registry進行添加(默認攔截所有) - 可以通過
addPathPatterns來表示攔截哪些請求 - 可以通過
excludePathPatterns不攔截哪些請求
對于URI匹配模式:
?:匹配一個字符*:匹配路徑段中的零個或者多個字符**:匹配零個或者多個路徑段
@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中進行配置
<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>總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Springboot注入成員變量HttpServletRequest的原理分析
這篇文章主要介紹了Springboot注入成員變量HttpServletRequest的原理分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
springboot 打包部署 共享依賴包(分布式開發(fā)集中式部署微服務)
這篇文章主要介紹了springboot 打包部署 共享依賴包(分布式開發(fā)集中式部署微服務)的相關資料,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-06-06
Java利用opencv實現(xiàn)用字符展示視頻或圖片的方法
這篇文章主要介紹了Java利用opencv實現(xiàn)用字符展示視頻或圖片的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12

