Spring MVC攔截器(Interceptor)的定義和配置過程
1、SpringMVC中組件: 攔截器(Interceptor)
攔截器(Interceptor)
對我們來說是非常實用的,也是經(jīng)常使用的,可以在所有的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>總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java實現(xiàn)對視頻進行截圖的方法【附ffmpeg下載】
這篇文章主要介紹了Java實現(xiàn)對視頻進行截圖的方法,結(jié)合實例形式分析了Java使用ffmpeg針對視頻進行截圖的相關操作技巧,并附帶ffmpeg.exe文件供讀者下載使用,需要的朋友可以參考下2018-01-01
Java使用Apache POI庫讀取Excel表格文檔的示例
POI庫是Apache提供的用于在Windows下讀寫各類微軟Office文檔的Java庫,這里我們就來看一下Java使用Apache POI庫讀取Excel表格文檔的示例:2016-06-06
SpringBoot中靜態(tài)訪問配置屬性的解決方案對比
在SpringBoot開發(fā)中,靜態(tài)訪問配置信息是一個常見需求,尤其是在工具類中直接獲取配置值,下面我們就來看看幾個常用的方法,大家可以根據(jù)需要選擇2025-03-03

