如何在ELB后面的tomcat上重定向到https

2023-12-02

我在 AWS 上有以下设置

ELB(终止 SSL) -> nginx 在 80 上接收 http 并转发到 -> 8080 上的 tomcat

但是当我在 servlet 中执行 response.sendRedirect("/somepath") 时,浏览器将其接收为 302http://example.com/somepath

但我希望浏览器能够https://example.com/somepath,如何在 tomcat 或 nginx 中实现此目的而不在其上设置 SSL。


这是因为response.sendRedirect();

SSL 卸载服务器实际上会导致 https URL 的问题 在 sendRedirect 的情况下转换为 http URL。让我们尝试一下 了解这一切是如何发生的。当 https URL 到达 中间 SSL 卸载服务器,请求被解码(以卸载 实际目标将完成的解码任务 服务器(否则)转换为 http 请求,SSL Offloader 现在发送 解码到实际目标服务器的http请求(它可能会去 也通过少数其他中间服务器用于其他目的)。 现在,目标服务器不知道它最初是否是 https 请求与否,它仅将其视为 http 请求。这是 servlet 在目标服务器上调用 sendRedirect 的原因 结果转化为重定向资源的 http URL(具有相对的 URL)并且相同的http URL被发送回客户端浏览器。 请记住,此 URL 不会出现任何 SSL 卸载服务器 因为它是一个 http 请求而不是 https 请求。如果重定向 资源是绝对 https URL,然后也是中间 SSL Offloader 可能会先将该 https 请求转换为 http 请求 它到达客户端浏览器。

该问题的解决方案是在 HttpServletResponseWrapper 中实现 Filter 并覆盖 sendRedirect。

Filter.

public class AbsoluteSendRedirectFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException { }
    public void destroy() { }
    public void doFilter(ServletRequest request,
            ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        //continue the request
        chain.doFilter(request, new SendRedirectOverloadedResponse(request, response));
    }
}

HttpServletResponseWrapper

public class SendRedirectOverloadedResponse extends HttpServletResponseWrapper {

    private HttpServletRequest m_request;
    private String prefix = null;

    public SendRedirectOverloadedResponse(HttpServletRequest inRequest,
            HttpServletResponse response) {
        super(response);
        m_request = inRequest;
        prefix = getPrefix(inRequest);
    }

    public void sendRedirect(String location) throws IOException {
        String finalurl = null;
        if (isUrlAbsolute(location)) {
            finalurl = location;
        } else {
            finalurl = fixForScheme(prefix + location);
        }
        super.sendRedirect(finalurl);
    }

    public boolean isUrlAbsolute(String url) {
        return url.toLowerCase().startsWith("http");
    }

    public String fixForScheme(String url) {
        //alter the url here if you were to change the scheme return url;
    }

    public String getPrefix(HttpServletRequest request) {
        StringBuffer str = request.getRequestURL();
        String url = str.toString();
        String uri = request.getRequestURI();
        int offset = url.indexOf(uri);
        String prefix = url.substring(0,offset);
    }
}

资源来自这里:
http://www.hoitikwong.com/2013/03/the-mystery-case-of-https-becoming-http.html and
http://geekexplains.blogspot.in/2008/06/https-becoming-http-in-case-of.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在ELB后面的tomcat上重定向到https 的相关文章

随机推荐

  • 如何设置自定义小部件的背景颜色和边框宽度?

    我有一个自定义小部件 其父级是另一个自定义小部件 我可以使用设置父自定义小部件的背景颜色QPalette而且效果很好 但我无法使用两者来设置子自定义小部件的边框颜色QPalette and stylesheet 这就是我设置父自定义小部件背
  • 使用 Azure Ad 中的服务应用程序限制对组或单个邮箱的访问

    我有一个 Azure 集成服务应用程序 守护程序应用程序 具有 Microsoft graph api 的权限 我现在可以读取整个公司的所有邮箱 这很棒 但可能会引起业务管理方面的一些担忧 我们在 Office 365 中使用 Outloo
  • StructureMap HowTo:深层对象的条件构造

    我很难有条件地创建依赖关系 谷歌搜索 我还没有找到使用 BuildStack 和条件谓词的好例子 这是我在注册表中所做的事情 snip public SomeRegistry this InstanceOf
  • 有什么可能的方法从 UIViewcontroller 类调用 drawRect 吗?

    我有一个UIViewController类称为AppController h AppController m 我在那里有数千行代码 这是我在询问之前没有测试它的唯一原因 有没有可能的方法来使用drawRect in a UIViewCont
  • 提高 Get-FileMetaData 的速度

    我目前正在使用以下来自 scriptingguys com 的脚本 这一切都归功于他们 我只是添加了最后两行 它需要一个目录并从文件的元数据中提取文件路径和注释字段 目前该脚本需要 1 5 分钟多一点才能完全运行 有没有办法加快速度或使用不
  • 按电源按钮启动应用程序

    我找到了这个code按电源按钮启动应用程序 我不知道为什么这个代码对我不起作用 但无论如何我正在将一些代码与清单一起放置 请检查 然后告诉我通过按一次或两次电源按钮启动应用程序的代码是否正确 toast Toast makeText get
  • 正则表达式根据之前匹配的内容来匹配某些内容

    我正在尝试编写一个正则表达式来验证移动国际象棋代数记数法 这是我到目前为止所拥有的 O O O Castling KQRBN x a h 1 8 Most normal moves and captures 我迷失的地方是典当促销 马 主教
  • SwingFXUtils 图像序列化替代方案(Javafx、Swing、Raspberry Pi)

    我的 JavaFX 应用程序的用例之一是在一侧加载图像 通过 TCP 套接字对其进行序列化 以在另一侧将其显示为 JavaFX 图像 为了实现这个我正在使用SwingFXUtils fromFXImage and SwingFXUtils
  • Angular 2 + 如何使用相同的选择器选择和循环多个元素(elementRef.nativeElement)

    在我的组件中 我尝试取消选择具有相同类名的所有复选框 querySelector每次 或一次 仅选择第一个 并且querySelectorAll不选择任何内容 这就是函数 我知道这样使用 jQuery 是错误的 但它说明了我的目标 unse
  • C 套接字发送 UDP 并处理来自路由器的 ICMP 回复

    我正在尝试向生存时间为 1 的路由器发送 UDP 数据包 然后接收 ICMP 超时回复 到目前为止 我能够发送数据包 但是当我的程序到达执行的接收部分时 它就挂起了 我对recvfrom进行了错误检查 但它甚至没有达到这一点 我的计算机正在
  • 在匹配中返回 Result>

    我有一组实现给定特征的类型 我想从字符串名称中获取具体类型对象 奇怪的是 当我的match回报Box
  • 目标 c 中 didload 方法启动时的 LandscapeOrientation

    我做了一个iPad应用程序 当我第一次以纵向模式加载应用程序时 它工作正常 但是当我第一次以横向模式加载应用程序时 它仅采用纵向模式的坐标 因为在我的内部didLoad方法我只给出纵向模式的坐标 现在需要给出我的横向模式的坐标didLoad
  • Docker 无法启动 Rails

    我正在尝试使用 Rails 启动我的 Rails 应用程序 它依赖于redis 它似乎可以工作 但是当rails服务器启动时它会失败Cannot assign requested address connect 2 for 1 6379 E
  • GetFileVersionInfo() 返回错误的文件版本信息

    我有一个应用程序需要检查各种系统 EXE 和 DLL 的版本以确定它们是否容易受到攻击 这是一个本机 C 应用程序 在其清单中不提供任何特定的 WinSxS 链接 在 Windows 7 上 当我在绝对路径 例如 c windows sys
  • 编写函数将某些列更改为小写

    我正在尝试编写一个函数 该函数允许我将数据框中某些字段的大小写更改为小写 我试图通过使用 function for 和 tolower 命令来做到这一点 但我没有任何运气 我对 R 还很陌生 所以我可能会遗漏一些明显的东西 我将不胜感激任何
  • 将具有动态高度的 div 移出其父容器

    我正在尝试将高度动态变化的 div 移出其父 div 并返回 问题是动态高度 否则我可以轻松地将负高度设置为底部值 现在我只是将一个很大的负数像素设置为底部值 但这不是很好 也不能正确解决问题 从逻辑上讲 这种情况发生在少数人身上 fidd
  • 这个计算每个元音出现次数的 C 程序有什么问题?

    PROBLEM 编写一个 C 程序 提示用户输入一串以 ENTER 键结尾的字符 即 n 然后统计该字符串中每个元音出现的总数 您的程序应遵循以下准则 你的程序应该声明一个由5个整型计数器组成的数组 即counter 使用循环 您的程序应将
  • 编写一个 c 函数,在给定特定范围的情况下生成一个随机数、一对随机数或一组随机数

    我必须为 3 种不同的情况生成随机数 我 1 个骰子 二 一对骰子 三 3 个骰子 我的问题 1 请建议我为所有 3 种情况生成随机数的良好逻辑 2 当我考虑2个骰子而不是1个骰子的cses时 逻辑会改变吗 3 我们生成随机数的范围对随机函
  • 如何在社交媒体应用中阻止 Firebase 上的用户?适用于 iOS

    在此输入图像描述我的应用程序完成度约为 90 并已准备好发布它 以便可以发布它进行测试 我被苹果拒绝了 因为我没有一个非常重要的功能 一种让用户阻止滥用用户的机制 我已经有了一个可以关注其他用户的功 能 但我一直困惑于如何阻止访问 这样当一
  • 如何在ELB后面的tomcat上重定向到https

    我在 AWS 上有以下设置 ELB 终止 SSL gt nginx 在 80 上接收 http 并转发到 gt 8080 上的 tomcat 但是当我在 servlet 中执行 response sendRedirect somepath