Spring MVC拦截器(Interceptor)的定义和配置过程
作者:库隐
这篇文章主要介绍了Spring MVC拦截器(Interceptor)的定义和配置过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
1、SpringMVC中组件: 拦截器(Interceptor)
拦截器(Interceptor)
对我们来说是非常实用的,也是经常使用的,可以在所有的HandlerMapping的前后进行拦截,当我们需要将特定功能应用于符合某种规则的请求的时候,这个时候就可以使用拦截器。
我们自定义的拦截器必须继承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 { /** * 在执行实际储器程序之前,根据返回的boolen判断是否放行 */ default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } /** * 执行处理程序之后 */ 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("处理程序执行完成耗时:"+ (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>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。