拦截器
Interceptor
用于拦截请求,类似于过滤器,不同于过滤器的是拦截器是Spring框架提供,而过滤器是JaveWeb三大组件之一。
使用拦截器能统一拦截请求,而无需在每一个方法上都加上相同的逻辑,减少了代码的复用。
常见场合:
- 统一登录校验,验证JWT令牌合法性
- 统一编码解码
- 统一敏感字符处理
- 其他通用性操作
拦截器:
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override // 目标资源方法执行前执行,返回true:放行,返回false:不放行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override // 目标资源方法执行后执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override // 视图渲染完毕后执行,最后执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}注册拦截器:
import edu.recipePost.interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration // 配置类
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**"); // 注册拦截器路径为请求的所有路径
}
}指定拦截路径:
// 在配置类中设置
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**") // 注册拦截器路径为请求的所有路径
.excludePathPatterns("/login"); // 不需要拦截的资源
}| 拦截路径 | 含义 | 举例 |
|---|---|---|
| /* | 任意一级路径 | 能匹配/a,不能匹配/a/b |
| /** | 任意级路径 | 能匹配/a、/b、/a/b |
| /a/* | /a下的一级路径 | 能匹配/a/b,不能匹配/a/b/c和/a |
| /a/** | /a下的任意级路径 | 能匹配/a、/a/b、/a/b/c,不能匹配/b |
与过滤器的区别:
过滤器在拦截器的外层拦截,过滤器拦截所有的资源,而拦截器只拦截Spring boot的资源。当有请求到来时,会先被过滤器截获,过滤器放行后会被拦截器拦截。