我在 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-Proto 和 X-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/