我在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有任何想法?
谢谢, 罗恩
答案 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);
}
}