如何覆盖 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-Proto 和 X-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);
}
}
我是 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-Proto 和 X-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);
}
}