Spring MVC攔截器(Interceptor)的定義和配置過程
1、SpringMVC中組件: 攔截器(Interceptor)
攔截器(Interceptor)
對我們來說是非常實(shí)用的,也是經(jīng)常使用的,可以在所有的HandlerMapping的前后進(jìn)行攔截,當(dāng)我們需要將特定功能應(yīng)用于符合某種規(guī)則的請求的時(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 { } /** * 在完成請求后 */ 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í)行完成耗時(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("從請求到完成響應(yīng)耗時(shí):"+ (endTime-startTime) + "毫秒"); } }
2、攔截器(Interceptor)的配置
在自定攔截器完成后,就是在Spring MVC 中配置我們的攔截器(Interceptor)了,可以通過Java配置類的方式進(jìn)行配置,也可以通過xml文件的方式進(jìn)行配置。
先從Java配置類的方式來看
@EnableWebMvc
: 表示啟用Spring MVC的功能@Configuration
: 表示該類是Spring 中的配置類- 攔截的配置需要重寫
WebMvcConfigurer
的addInterceptors(InterceptorRegistry registry)
方法,通過registry
進(jìn)行添加(默認(rèn)攔截所有) - 可以通過
addPathPatterns
來表示攔截哪些請求 - 可以通過
excludePathPatterns
不攔截哪些請求
對于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)文章
Spring Boot 動(dòng)態(tài)數(shù)據(jù)源示例(多數(shù)據(jù)源自動(dòng)切換)
本篇文章主要介紹了Spring Boot 動(dòng)態(tài)數(shù)據(jù)源示例(多數(shù)據(jù)源自動(dòng)切換),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02Java編程構(gòu)造方法與對象的創(chuàng)建詳解
這篇文章主要介紹了Java編程構(gòu)造方法與對象的創(chuàng)建詳解,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11SpringBoot多環(huán)境開發(fā)該如何配置
這篇文章主要介紹了 SpringBoot多環(huán)境的開發(fā)配置詳情,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09詳解基于MybatisPlus兩步實(shí)現(xiàn)多租戶方案
這篇文章主要介紹了詳解基于MybatisPlus兩步實(shí)現(xiàn)多租戶方案,本文分兩步,通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04