Spring MVC中提供了AOP风格的拦截器,拥有更加精细的拦截处理能力。Spring Boot中拦截器的注册更加方便,步骤如下:
创建一个Spring Boot项目,添加spring-boot-starter-web依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
创建拦截器实现HandlerInterceptor接口,代码如下:
MyInterceptor.java
package com.shrimpking.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/5 10:17
*/
public class MyInterceptor implements HandlerInterceptor
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
System.out.println("MyInterceptor>>>preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{
System.out.println("MyInterceptor>>>postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{
System.out.println("MyInterceptor>>>afterCompletion");
}
}
拦截器中的方法将按preHandle→Controller→postHandle→afterCompletion的顺序执行。
注意,只有preHandle方法返回true时后面的方法才会执行。当拦截器链内存在多个拦截器时,postHandler在拦截器链内的所有拦截器返回成功时才会调用,而afterCompletion只有preHandle返回true才调用,但若拦截器链内的第一个拦截器的preHandle方法返回false,则后面的方法都不会执行。
配置拦截器
定义配置类进行拦截器的配置,代码如下:
package com.shrimpking.config;
import com.shrimpking.interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/5 10:20
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer
{
@Override
public void addInterceptors(InterceptorRegistry registry)
{
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/hello");
}
}
自定义类实现WebMvcConfigurer接口,实现接口中的addInterceptors方法。其中,addPathPatterns表示拦截路径,excludePathPatterns表示排除的路径。
测试
在浏览器中提供/hello2和/hello接口分别进行访问,当访问/hello2接口时,打印日志