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>总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
