什么是拦截器?
拦截器是 Spring 框架提供的核⼼功能之⼀,主要⽤来拦截⽤户的请求, 在指定⽅法前后,根据业务需要执行预先设定的代码.
也就是说,允许开发⼈员提前预定义⼀些逻辑,在请求访问接口前/后执行.也可以在⽤户请求前阻止其进入接口执行
在拦截器当中,开发⼈员可以在应⽤程序中做⼀些通⽤性的操作,⽐如通过拦截器来拦截前端发来的请求,判断 Session 中是否有登录⽤户的信息.如果有就可以放⾏,如果没有就进⾏拦截.
拦截器的使用
1. 定义拦截器
⾃定义拦截器:实现 HandlerInterceptor 接⼝,并重写其⽅法
@Component
@Slf4j
//定义拦截器
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("LoginInterceptor ⽬标⽅法执⾏前执⾏..");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("LoginInterceptor ⽬标⽅法执⾏后执⾏");
}
}
如上代码,重写 preHandle() 方法,会在目标方法执行前执行,如果返回 true 就会继续执行后续操作,如果返回 false 就中断后续操作(相当于拦截了不符合要求的请求)常用于实现强制登录的效果
重写 postHandle() 方法,会在目标方法执行后执行
2. 配置拦截器
实现 WebMvcConfigurer 接⼝,并重写 addInterceptors ⽅法
//加上 @Configuration 注解,配置才会生效
@Configuration
//项目配置
public class WebConfig implements WebMvcConfigurer {
//登录拦截器
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/User/login");
}
}
registry 对象调用 addInterceptor() 方法来添加拦截器,
调用 addPathPatterns() 来设置拦截器要拦截哪些请求,
调用 excludePathPatterns 来设置拦截器不拦截哪些请求
在上述代码中 /** 表示要拦截所有的请求, /User/login 表示不拦截该网络路径的请求
常见的拦截路径设置
以上拦截规则可以拦截此项⽬中指定的 URL ,包括静态⽂件(图⽚⽂件, JS 和 CSS 等⽂件).
我们可以通过如下的代码,不拦截对前端静态资源的访问,拦截对后端接口的访问
@Configuration
public class WebConfig implements WebMvcConfigurer {
//⾃定义的拦截器对象
@Autowired
private LoginInterceptor loginInterceptor;
private List<String> excludePaths = Arrays.asList(
"/user/login",
"/**/*.js",
"/**/*.css",
"/**/*.png",
"/**/*.html"
);
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册⾃定义拦截器对象
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")//设置拦截器拦截的请求路径(/** 表⽰拦截所有请求)
.excludePathPatterns(excludePaths);//设置拦截器排除拦截的路径
}
}