繁体   English   中英

如何捕获J2EE重定向?

[英]How can I capture J2EE redirects?

我有一个在Docker容器中运行的Spring Boot应用程序。 容器公开了端口80,尽管我有一个接受HTTP和HTTPS流量的负载平衡器(并将两者转发到容器的端口80上)。

我遇到的麻烦是,尽管HTTPS可以工作,但是在容器内运行的应用程序似乎认为所有流量都来自HTTP,即使它确实可以访问原始请求URL。 我的意思是:如果我访问https://www.mycontainerapp 。无论页面将加载什么。 但是,如果我转到触发重定向的任何URL路径,例如https://www.mycontainerapp.whatever/redirect-to-something-else ,应用程序将始终重定向到http://www.mycontainerapp.whatever/redirect-target使用纯HTTP会丢失HTTPS。

我承认我不一定了解我想编写哪种类的正确的J2EE术语。 可能是过滤器,拦截器,连接器或某种其他的Servlet类。 我打算做的就是编写一个类,该类检查原始请求是否以“ https”开头,并确保最终的重定向URL也包含https。 我只是不确定什么是正确的切入点。 我怎样才能“捕获”这样的重定向?

如果要使用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);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM