Interceptor

用于拦截请求,类似于过滤器,不同于过滤器的是拦截器是Spring框架提供,而过滤器是JaveWeb三大组件之一。
使用拦截器能统一拦截请求,而无需在每一个方法上都加上相同的逻辑,减少了代码的复用。
常见场合:

  1. 统一登录校验,验证JWT令牌合法性
  2. 统一编码解码
  3. 统一敏感字符处理
  4. 其他通用性操作

拦截器:

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的资源。当有请求到来时,会先被过滤器截获,过滤器放行后会被拦截器拦截。

标签: none

添加新评论