如何使用具有默认 java Build Pack 的 Tomcat 服务器在 Ibm Bluemix 中强制实施 Https 连接?

Posted

技术标签:

【中文标题】如何使用具有默认 java Build Pack 的 Tomcat 服务器在 Ibm Bluemix 中强制实施 Https 连接?【英文标题】:How do I enforce Https Connection in Ibm Bluemix using Tomcat Server with Default java Build Pack? 【发布时间】:2017-09-18 10:00:27 【问题描述】:

我有一个 Spring Mvc 应用程序,使用托管在 ibm bluemix 上的 hibernate,域在 go daddy 中使用 tomcat 服务器注册,使用 blue mix 为 tomcat 提供的 java_buildpack。目前我在 go 中购买了 ssl 证书爸爸在蓝色组合中注册。我的应用程序现在可以在 http 和 https 上运行。但现在我需要强制只使用 https 连接到我的应用程序。我实现了 Spring Security。我已经使用安全配置来强制执行 https 并使用下面的 https 代码重定向。

requiresChannel().anyRequest().requiresSecure()

但它在浏览器中给了我以下错误

Too many redirects occurred trying to open “https://website-name”. This might occur if you open a page that is redirected to open another page which then is redirected to open the original page.

现在我通过网络跟踪了几个链接,以便强制执行 https,他们告诉我添加一些参数,我在我的应用程序的蓝色混合运行时环境变量中添加了这些参数。

server.tomcat.internal-proxies:.*

我也试过添加

server.tomcat.remote_ip_header:x-forwarded-for

server.tomcat.protocol_header:x-forwarded-proto

应用程序的流程首先是去爸爸查找然后它去蓝色混合应用程序我怎么能只启用 https

但我仍然得到相同的错误。 各位大侠能帮我解决一下这个问题吗。

我添加了自定义过滤器

@Component
public class CustomFilter implements Filter 
    private static final Logger logger = Logger.getLogger(CartController.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException 
        // TODO Auto-generated method stub

    

    @Override
    public void doFilter(ServletRequest request1, ServletResponse response1, FilterChain chain)
            throws IOException, ServletException 

        HttpServletRequest request = (HttpServletRequest) request1;
        HttpServletResponse response = (HttpServletResponse) response1;
        if (!request.isSecure()) 
            logger.info("Not secure");
            // generate full URL to https
            StringBuilder newUrl = new StringBuilder("https://");
            newUrl.append(request.getServerName());
            if (request.getRequestURI() != null) 
                newUrl.append(request.getRequestURI());
            
            if (request.getQueryString() != null) 
                newUrl.append("?").append(request.getQueryString());
            

            response.sendRedirect(newUrl.toString());
         else 
            // already a secure connection, no redirect to https required.
            logger.info("Else");
            if (chain != null) 
                logger.info("Chain Null");
                chain.doFilter(request, response);
            
        

    



【问题讨论】:

【参考方案1】:

我建议两种选择: 1.过去我手动实现了一个过滤器,如果收到非http请求重定向到https。我没有以您尝试的方式使用弹簧安全性。 2. 向 Spring 安全主管 Rob Winch 发布关于 Spring 表单的问题并交叉链接到该问题,以便 Bluemix 平台上的人员可以看到他的回复。

我最初的想法是手动过滤器是可行的方法,但我真的很想知道 Rob 和团队是否在 CF 平台上遇到过这种情况。

【讨论】:

有没有示例代码手动实现过滤器重定向到https。 这里的第一个答案是一个很好的例子,说明如何使用类扫描来查找特定的 bean。您还可以创建一个实现过滤器接口的类,然后使用@component 注释该类。在类中检查协议是否为 http,然后重定向到 https。它应该很简单。 [1] ***.com/questions/26151057/… [2] docs.spring.io/spring-boot/docs/1.1.6.RELEASE/reference/html/… 如果您想将一些代码发布到 GitHub 存储库,我可以看看。

以上是关于如何使用具有默认 java Build Pack 的 Tomcat 服务器在 Ibm Bluemix 中强制实施 Https 连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何为msbuild安装nuget.build.tasks.pack.targets

如何更改MapStruct生成的* .java文件的位置?

如何将 sbt pack 插件导入项目

使用visual studio pack在nuget包中包含构建目录

x-pack安装

如何将参数从 Web-pack 传递到代码?