如何使spring boot嵌入式tomcat返回200 OK for base url?

时间:2016-09-16 05:49:37

标签: java spring spring-mvc spring-boot

我的应用已部署在http://123.87.65.23:8080。在/myapp中配置了application.properties上下文路径。因此,如果我访问http://123.87.65.23:8080,则会获得404.但如果我访问http://123.87.65.23:8080/myapp/health,则会按预期获得200。

我们的运营团队监控基本网址(http://123.87.65.23:8080)200 OK。 我有两个选择:

  1. 点击http://123.87.65.23:8080时返回200 OK。无需回复。

  2. 或以某种方式将请求http://123.87.65.23:8080代理到我的Spring Boot应用程序中的http://123.87.65.23:8080/myapp/health

  3. 注意:我使用的是嵌入式tomcat。所以更改server.xml的选项不适用

    我不知道怎么做两种选择。

3 个答案:

答案 0 :(得分:2)

如果您在contextPath文件中设置了.properties属性,则Spring会执行其应该执行的操作,所有内容都会移动到那里。

如果您将应用程序打包为.war并在外部服务器中运行,则可以将该服务器设置为将根请求重定向到Spring Boot应用程序中的任何URL。

如果您将应用程序打包为具有嵌入式服务器的可运行.jar,并且您希望将contextPath保持在.properties级别然后

a)您仍然需要某种外部服务器来捕获root请求并重定向到Spring Boot应用程序

b)您需要设置两个不同的DispatcherServlets,其中contextPath /myapp/而另一个contextPath@RequestMapping,这将会重定向你的Spring Boot应用程序

但是,最简单的解决方案是删除/myapp,并将每个控制器的management添加到/myapp之前,移动所有management.context-path 1}}端点@Controller/并写一个映射到read_only=True的{​​{1}}方法重定向到健康端点。

答案 1 :(得分:2)

如果您希望获得200 ROOT.war次请求,则需要在您的webapps文件夹中使用名为http://123.87.65.23:8080的应用程序。

所以http://123.87.65.23:8080/myapphttp://123.87.65.23:8080是两个不同的应用程序。

我建议你两个选择:

  1. 将您的应用程序部署为location / { proxy_pass http://123.87.65.23:8080/myapp/; } (ROOT.war)
  2. 使用某些代理服务器,如nginx或apache。您可以将代理服务器配置为将所有ROOT请求重定向到您的应用程序
  3. 以下是 nginx 的一些示例:

    location / {
        return 200;
    }
    

    或者只返回200:

    /**
         * check_required_addons function.
         *
         * @access private
         * @param mixed $product_id
         * @return void
         */
        private function check_required_addons( $product_id ) {
            $addons = get_product_addons( $product_id, false, false, true ); // No parent addons, but yes to global
    
            if ( is_array($addons)) {
                return 1 < array_sum(array_column($addons,'required'));  
            }
    
            return false;
        }
    

答案 2 :(得分:1)

在您的tomcat容器中,如果您想使用根URL,您的应用程序应该部署到名为“ROOT”的目录中,而不是“myapp”。我猜你的Dispatcherservlet可能被配置为处理/ health的请求,你需要处理/ 或者你可能有一个控制器,映射到/ health。 没有代码就无法告诉别的什么