首页 > 解决方案 > 通过过滤器/拦截器代理http请求的最直接方法是什么?

问题描述

对于我的项目,我需要使用过滤器或拦截器在 Spring Boot 中实现一个简单的代理。因此,我的微服务 A 将只接收一个针对微服务 B 的 http 请求,将其与所有标头/查询参数一起转发,并使用正确的响应代码返回好或坏的响应,并且微服务 B 将添加任何响应标头。

我知道已经准备好使用诸如 spring-cloud-gateway 或 spring-cloud-zuul 之类的库,但它们都与我拥有的其他规范冲突并且无法使用它们。此外,我真的不需要任何过滤/聚合逻辑,我只想做一个简单的代理。

我尝试执行以下操作:

@Component
@Order(1)
public class ByPassFilter extends OncePerRequestFilter {

      @Value("${proxy.active}")
      private Boolean active;

      @Override
      public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {
        if(active){
             RestTemplate rest = new RestTemplate(); //overkill here?
             HttpMethod method = HttpMethod.resolve(request.getMethod());

             switch(method){
                 case GET:
                    //use rest template to do get

              }
        }else{
          filterChain.doFilter(request, response);
        }
}

但是 RestTemplate 似乎很复杂,因为它应该在我要处理/处理请求时使用,如果代码不是 200,它甚至会返回异常。我也不知道如何将输出直接写入 HttpServletResponse。

那么,还有其他更透明的方式吗?我看到有人使用 apache 的 OkHttpClient,是不是比 RestTemplate 更通用一点?

标签: spring-bootspring-mvcjava-8

解决方案


推荐阅读