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

How Do I Override X-Forwarded-Proto and X-Forwarded-Port So Rels Are Properly Calculated?

我是 AWS 中的 运行 SDR 2.6.4,并且遇到 rels 计算不正确的情况。

我有一个 API 网关代理对 Application Load Balancer 的调用,后者将调用转发到 SDR。 AGW 终止 TLS 连接,通过纯 HTTP 和 non-standard 端口与 ALB 通信。

URL 看起来像这样:

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

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

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

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

在调试器中看到的东西让我相信一旦 Tomcat 移交 HTTP 请求 object,它就完全形成了并且 Spring 不能做任何修改它.

有人知道我如何 add/modify 前锋 headers 指向 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);
    }
}