1.引入pom依赖
- 因为用到拦截器的 几乎都是web项目,引入下web包 拦截器对象也在web包里
- thymeleaf: 查看静态界面;
<!--引入springboot父工程依赖-->
<!--引入依赖作用:
可以省去version标签来获得一些合理的默认配置
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<dependencies>
<!--引入含有WebMvcConfigurer的包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--模板引擎 -用于查看界面-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
2. 启动类配置
- 只需要注意下 其它的类都要在启动类同包或及下层目录即可 让@SpringBootApplication中@ComponentScan扫描到;
- 如果类不在同级目录或下层目录 可以用@Import(Xxx.class)引入;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class InterceptorTestAppliction {
public static void main(String[] args) {
SpringApplication.run(InterceptorTestAppliction.class, args);
}
}
3.resources包下数据
- 主要测试拦截器相应的几个功能,它们的内容并不重要;

4.HandlerInterceptor 自定义拦截器实例配置
- 三个方法的运行顺序为: preHandle -> postHandle -> afterCompletion;
- 如果preHandle返回值为false,三个方法仅运行preHandle;
- 如果运行拦截放行后的代码出错,则不会执行postHandle;
- 自定义拦截器实例需要实现HandleInterceptor接口;
- 注入到 ioc 自定义拦截器配置需要使用到 拦截器实例;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("前置运行----a1");
System.out.println(handler);
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("后置运行----b1");
System.out.println(handler);
System.out.println(modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
System.out.println("完成运行----c1");
System.out.println(handler);
System.out.println(ex);
}
}
5.WebMvcConfigurer 自定义拦截器配置
- WebMvcConfigurer是一个接口,提供例如跨域设置、自定义的拦截器、类型转化器等等
- 跨域这方面,我并不打算用拦截器来做 用网关的过滤器会更好,这里就开阔下思路 拦截器 也能做跨域设置
5.1 启用并注册自定义拦截器实例
- 将拦截器实例 从ioc获取出来 将拦截器当作入参传入InterceptorRegistry();
一定要指定拦截器路径和排除拦截路径;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration interceptorRegistration = registry.addInterceptor(myInterceptor);
interceptorRegistration.addPathPatterns("/**");
interceptorRegistration.order(0);
interceptorRegistration.excludePathPatterns("/mhh/Interceptor/excludeInterceptorTest");
}
}
5.11 拦截器测试
- 正常访问–interceptorTest:进入拦截器–preHandle()–>进入要访问的方法–interceptorTest()–>进入拦截器–postHandle()–>进入拦截器–afterCompletion–>返回页面;
- 排除–excludeInterceptorTest:它不会进入拦截器 正常进入—>然后返回;
- 代码出错访问–exceptionTest:进入拦截器–preHandle()–>进入要访问的方法–exceptionTest()–>代码出错–>进入拦截器–afterCompletion–>返回页面
(它不会走拦截器postHandle()方法)
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/mhh/interceptor")
public class InterceptorTestController {
@RequestMapping("interceptorTest/{id}")
public String InterceptorTest(@PathVariable("id") String docId){
return docId;
}
@RequestMapping("excludeInterceptorTest")
public String excludeInterceptorTest(){
return "排除测试";
}
@RequestMapping("exceptionTest")
public void exceptionTest(){
throw new RuntimeException("测试异常错误");
}
}
5.2 自定义资源映射
- classpath:表示项目绝对目录
- file:表示本地绝对目录
- 映射路径末尾必须加:
/
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/mhh/interceptor/document/*").addResourceLocations("file:///D:/doc/");
registry.addResourceHandler("/mhh/interceptor/js/*").addResourceLocations("classpath:static/js/");
}
}
5.21 自定义资源映射测试
- file:表示本地绝对目录
- 可以看出访问的是: http://localhost:8080/mhh/interceptor/document/aa.png
映射的是: D:/doc/aa.png

- classpath:表示项目相对目录
- 可以看出访问的是:http://localhost:8080/mhh/interceptor/js/jquery.js
实际访问的是:static/js/jquery.js
5.3 通过路径自动跳转到一个页面
- 这个方法可以实现,一个路径自动跳转到一个页面
- 相当于使用 new ModelAndView(“login”)方法跳转

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/goToLogin").setViewName("login");
}
}
5.31通过路径自动跳转到一个页面测试
- 首先是
通过ModelAndView方式跳转
寻找指定的页面


通过拦截器addViewControllers方式跳转


5.4 addCorsMappings(CorsRegistry registry) 设置跨域
- 主要解决跨域问题(还是建议跨域问题在网关通过配置 CorsWebFilter实例)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
CorsRegistration corsRegistration = registry.addMapping("/**");
corsRegistration.allowedOrigins("*");
corsRegistration.allowCredentials(true);
corsRegistration.allowedMethods("GET", "POST", "DELETE", "PUT");
corsRegistration.allowedHeaders("*");
corsRegistration.exposedHeaders(HttpHeaders.CONTENT_DISPOSITION);
corsRegistration.maxAge(3600);
}
}
5.5 addFormatters(FormatterRegistry registry)数据格式化器配置
- 注入自己定好的日期格式化实例DateFormatter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
private DateFormatter dateFormatter;
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(dateFormatter);
}
}
5.51 首先实现格式化配置实例(这里用日期做实例)
- 用于接受 HTTP 请求把日期参数自动绑定映射到 Controller 请求参数上
- Spring 中没有默认配置将字符串转换为日期类型。
- 这里的日期类型模板是重点,用来表示前台用怎样的形式进行传值。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.springframework.format.Formatter;
import org.springframework.stereotype.Component;
@Component
public class DateFormatter implements Formatter<Date> {
private String datePattern="yyyy-MM-dd";
private SimpleDateFormat dateFormat;
public DateFormatter() {
this.dateFormat = new SimpleDateFormat(datePattern);
}
public String print(Date date,Locale locale){
return dateFormat.format(date);
}
public Date parse(String source, Locale locale) throws ParseException {
try {
return dateFormat.parse(source);
} catch (Exception e) {
throw new IllegalArgumentException();
}
}
}
5.52 数据格式化器配置测试
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import java.util.Date;
@RestController
@RequestMapping("/mhh/interceptor")
public class InterceptorTestController {
@GetMapping("getDate")
public Date getDate(@RequestParam("date") Date date) {
return date;
}
}
