我有一个运行在Docker容器中的Spring Boot应用程序。该容器暴露了端口80,尽管我有一个负载平衡器,它既可以接受HTTP流量,也可以接受HTTPS流量(并将两者转发到容器的端口80上)。
我遇到的麻烦是,尽管HTTPS可以工作,但是在容器内运行的应用程序似乎认为所有流量都来自HTTP,即使它确实可以访问原始请求URL。我的意思是:如果我访问https://www.mycontainerapp.whatever,则页面将加载。但是,如果我转到触发重定向的任何URL路径,例如https://www.mycontainerapp.whatever/redirect-to-something-else,应用程序始终使用纯HTTP重定向到http://www.mycontainerapp.whatever/redirect-target,从而丢失HTTPS。
我承认对于我想编写哪种类,我不一定知道正确的J2EE术语。可能是过滤器,拦截器,连接器或某种其他的Servlet类。我打算做的就是编写一个类,该类检查原始请求是否以“ https”开头,并确保最终的重定向URL也包含https。我只是不确定什么是正确的切入点。我该如何“捕获”这样的重定向?
答案 0 :(得分:0)
如果要使用elb终止的ssl进行正确的重定向,则需要查询x-forwarded-proto
头并检查其是否为https
。在这种情况下,您可以使用适当的协议进行重定向
@WebFilter(urlPattern = "/")
public class RedirectDetectFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// Detect and do redirect here
HttpServletRequest servletRequest = (HttpServletRequest)request;
HttpServletResponse servletResponse = (HttpServletResponse)response
if(isRedirectNeeded(servletRequest, servletResponse) {
// build absoulute url with protocol:
String protocol = servletRequest.getheader(X-FORWARDED-PROTO);
String absUrl = format("%s://%s/%s", protocol, host, redirectUrl);
servletResponse.sendRedirect(absUrl);
} else {
chain.doFilter(request, response);
}
}
}