【问题标题】:How can I capture J2EE redirects?如何捕获 J2EE 重定向?
【发布时间】:2018-07-19 14:30:11
【问题描述】:

我有一个在 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。我只是不确定正确的切入点是什么。我怎样才能“捕获”这样的重定向?

【问题讨论】:

标签: java spring docker servlets jakarta-ee


【解决方案1】:

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

【讨论】:

  • 太棒了,谢谢。但我要问的是更多特定于 Java 的问题:如何我该如何拦截重定向?
  • 那是 java 特有的。从HttpRequestServlet.getheader(X-FORWARDED-PROTO) 构建重定向网址并使用HttpServletResponse.sendRedirect(absoluteUrl)
  • 我的意思是我不会像这样(使用 .sendRedirect() 方法)手动制作每个重定向 - 出于多种原因 - 最重要的是因为它会违反干燥原则。我有一个已经发送重定向的现有代码库;我想要做的是捕获每个重定向,然后在此处对您的代码运行变体,我的问题是我如何首先捕获那些现有的重定向。
  • 那么您需要在过滤器中创建一个响应包装器,然后覆盖sendRedirect。确保过滤器是执行链中的第一个(在 webxml 中声明)。在 override 方法中,操作协议,然后使用正确的绝对 url 调用 super.sendRedirect
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
相关资源
最近更新 更多