如何正确计算X-Forwarded-Proto和X-Forwarded-Port So Rels?

时间:2017-10-30 18:44:38

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

我在AWS中运行SDR 2.6.4并且在某种情况下没有正确计算rel。

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

网址如下所示:

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

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

原因是ALB用其调用的值填充 X-Forwarded-Proto X-Forwarded-Port ,而不是AGW是什么调用,并且 UriComponentsBuilder 使用这些值来计算rels。

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

在调试器中观察事物让我相信,一旦Tomcat移交HTTP请求对象,它就会完全形成,Spring无法做任何修改它。

有没有人对如何添加/修改前向标题以指向AGW而不是ALB有任何想法?

谢谢, 罗恩

1 个答案:

答案 0 :(得分:2)

正如您所述,您无法修改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);
    }
}