微服务项目拦截器总结

272 阅读2分钟

认识拦截器

具体实现步骤:

  1. 创建一个拦截器类,实现 Spring 的 HandlerInterceptor 接口,并实现相应的方法。通常,我们会关注 preHandle、postHandle 和 afterCompletion 这三个方法。preHandle 方法在请求之前执行,postHandle 在处理请求后执行,afterCompletion 在视图渲染完成后执行。
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求处理之前执行的逻辑
        return true; // 返回 true 继续执行请求,返回 false 停止请求处理
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在视图渲染完成后执行的逻辑
    }
}
  1. 配置拦截器类,将其添加到 Spring Boot 的拦截器链中。可以在配置类上使用 @Configuration 注解,同时实现 WebMvcConfigurer 接口重写 addInterceptors 方法。
@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加自定义拦截器,并指定拦截路径
        registry.addInterceptor(new MyInterceptor());
    }
}

微服务项目涉及拦截器

image.png

1、全局过滤器

image.png

// 3、获取token
List<String> headers = request.getHeaders().get("authorization");
// 4、解析token
String token = null;
if(headers != null){
    token = headers.get(0);
}
// 4、用户的信息
Long userId = null;
try {
    userId = jwtTool.parseToken(token);
} catch (Exception e) {
    ServerHttpResponse response = exchange.getResponse();
    response.setRawStatusCode(401);
    return response.setComplete();
}
// 5、传递用户到下游服务
String userinfo = userId.toString();
ServerWebExchange build = exchange.mutate()
        .request(builder -> builder.header("user-info", userinfo))
        .build();

注意:request(builder -> builder.header("user-info", userinfo))将用户信息设置到请求头传入下一级服务

2、用户拦截器

网关校验通过后,再直接进入用户拦截器

image.png

public class UserInfoInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String userInfo = request.getHeader("user-info"); // user-info
        System.out.println("userInfo:::" + userInfo);
        if(StrUtil.isNotBlank(userInfo)){
            // 拿到用户userId保存UserContext
            UserContext.setUser(Long.valueOf(userInfo));
        }
        return true;
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求完成后将用户信息从ThreadLocal删除
        UserContext.removeUser();
    }
}

3、openFeign拦截器

认识,在使用 Spring Cloud 中的 OpenFeign 时,可以使用拦截器(Interceptor)来对 Feign 请求进行拦截和处理。拦截器可以用于在发送请求前或接收响应后执行一些自定义的逻辑,例如请求认证、添加请求头等。拦截器可以对所有的 Feign 请求生效,也可以根据需要进行配置。

3.1 创建一个拦截器类,实现 Feign 的 RequestInterceptor 接口,并实现其 apply 方法。在 apply 方法中,你可以通过 RequestTemplate 对象来设置请求头、请求参数等信息。

@Configuration
public class MyFeignInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        // 在这里可以对请求进行拦截和处理
        requestTemplate.header("Authorization", "Bearer myAccessToken");
        // 设置其他请求头、请求参数等
    }
}

3.2 在Spring Boot 的配置类中,将拦截器添加到 Feign 的配置项中。

@Configuration
public class FeignConfig {

    @Bean
    public RequestInterceptor myFeignInterceptor() {
        return new MyFeignInterceptor();
    }
}

3.3 这样,拦截器就会被应用于所有使用 OpenFeign 发起的请求中,可以在拦截器的 apply 方法中执行一些自定义的逻辑,并对请求进行修改或处理。

作者:vito