aws-api-gateway - 如何覆盖 X-Forwarded-Proto 和 X-Forwarded-Port 以便正确计算 Rels?

标签 aws-api-gateway spring-data-rest

我在 AWS 中运行 SDR 2.6.4,并且遇到了 rel 未正确计算的情况。

我有一个 API 网关,代理对应用程序负载均衡器的调用,该负载均衡器将调用转发到 SDR。 AGW 终止 TLS 连接,通过普通 HTTP 和非标准端口与 ALB 进行通信。

URL 看起来像这样:

https://apigateway:443/foo -> http://loadbalancer:9876/foo

计算得到的 rels 是两者的混合: http://apigateway:9876/bar

原因是 ALB 使用调用时的值填充 X-Forwarded-ProtoX-Forwarded-Port,而不是 AGW 的值调用 with,UriComponentsBuilder 使用这些值来计算 rels。

我最初的想法是创建一个 HandlerInterceptor 并强制使用这些值,但很快发现 HttpServletRequest 不允许 HTTP header 发生变化。

观察调试器中的情况让我相信,一旦 Tomcat 交出 HTTP 请求对象,它就已完全形成,Spring 无法对其进行任何修改。

有人对如何添加/修改转发 header 以指向 AGW 而不是 ALB 有任何想法吗?

谢谢, 罗恩

最佳答案

正如您所说,您无法修改 HttpServletRequest,但可以包装它。

https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequestWrapper.html

通过 Servlet 过滤器而不是通过 Spring 拦截器,您应该能够执行以下操作:

包装:

public class MyRequestWrapper extends HttpServletRequestWrapper{

    public MyRequestWrapper(HttpServletRequest request){
        super(request);
    }

    @Override 
    public String getHeaders(String name){
        if(name.equals("X-Forwarded-Proto"){
            return "xyz";
        }
        else{
            return ((HttpServletRequest)getRequest()).getHeaders(name);
        }
    }
}

过滤器:

public class MyFilter implements Filter{

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        chain.doFilter(new MyRequestWrapper((HttpServletRequest)request), response);
    }
}

关于aws-api-gateway - 如何覆盖 X-Forwarded-Proto 和 X-Forwarded-Port 以便正确计算 Rels?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47022219/

相关文章:

node.js - HTTP/2 在 AWS API Gateway + Lambda 上推送

aws-lambda - 有没有办法让aws lambda函数返回404

amazon-web-services - 在 Google Cloud Platform 上构建 API

node.js - 如何从 ApiGateway 缓存资源获取内容编码

java - 错误 Controller 如何: Spring-boot + Spring-Data-Rest

rest - 使用 spring hateoas 公开集合实体上的链接

aws-api-gateway - API 网关 HTTP 代理与无服务器离线集成(不是 Lambda 代理)

spring-data-rest - Spring Data Rest Jpa插入@Lob字段

java - 如何在 spring-boot data rest 的 POST json 中传递 @EmbeddedId

java - Spring Data REST、QueryDSL 和 HashMaps - 引用 HashMap 属性时来自 URL 的 Null 谓词