当前位置: 首页 > 知识库问答 >
问题:

SpringBoot执行器在同一端口上被BaseService Servlet掩盖

徐经武
2023-03-14

我们正在尝试将现有的SpringWebServices应用程序迁移到SpringBoot,但遇到了一个问题,我们将寻求您的建议。

出于安全原因,我们有一个Base Service Servlet可以禁用部署应用程序的端口上的GET,该servlet返回501未实现响应,如下所示:

 @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        log.warn("GET request received!");
        response.setStatus(HttpServletResponse.SC_NOT_IMPLEMENTED);
    }
public abstract class BaseServiceServlet extends HttpServlet {
 ...
 } 
  
 public class ServiceServlet extends BaseServiceServlet {
 ...
 } 
  
  
  public class ServletInitializer extends SpringBootServletInitializer implements ServletContextInitializer { 
  @Override
    public void onStartup(ServletContext container) throws ServletException {
         
      ServletRegistration.Dynamic application = container
                .addServlet("ServiceServlet", new ServiceServlet()); 
      application.setLoadOnStartup(2);
      application.addMapping("/*");
        
    }
 }

以前我们实现了一个老式的HealthCheck JSP。随着迁移到SpringBoot,我们现在使用SpringBoot Actuator。

但我们发现,如果我们在尝试监控健康时将致动器健康监控端口设置为与应用程序相同的端口,则会得到501未实现的响应。

配置如下:

# Spring-Boot Embedded Tomcat Config
server.port=8080
server.connection-timeout=10s
server.ssl.enabled=false
## Springboot based health monitor
management.endpoints.enabled-by-default=true
management.endpoint.health.enabled=true
management.endpoint.loggers.enabled=true
management.endpoints.web.cors.allowed-methods=GET
management.endpoint.beans.cache.time-to-live=20s
management.endpoints.web.base-path=/manage
management.server.port=8080
management.security.enabled=false 

我们可以绕过这个问题的一种方法是,如果我们将致动器健康检查端口更改为其他可以工作的端口。

问题:我们如何将致动器端口设置为与应用程序相同,并使致动器健康检查url类似http://localhost:8080/manage/health是否从基本服务Servlet返回501未实现?

共有1个答案

叶允晨
2023-03-14

我们可以在ServiceServlet之前的映射中使用健康endpoint注册DispatcherServlet。

@SpringBootApplication
public class ServletInitializer extends SpringBootServletInitializer implements ServletContextInitializer {
    @Autowired
    private DispatcherServlet dispatcherServlet;

    @Override
    public void onStartup(ServletContext container) throws ServletException {
        ServletRegistration.Dynamic dispatcher =
                container.addServlet("dispatcher", dispatcherServlet);
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/manage", "/manage/health");

        ServletRegistration.Dynamic application = container
                .addServlet("ServiceServlet", new ServiceServlet());
        application.setLoadOnStartup(2);
        application.addMapping("/*");
    }
}
 类似资料:
  • 我想用Rust,Hyper和WebSocket-RS编写一个Web服务器。webserver必须能够在同一端口上处理http请求和websocket请求。我使用了正式示例(:https://github.com/cyderize/rust-websocket/blob/master/examples/async-server.rs),并尝试对其进行修改。我的想法是改变错误处理。如果客户机的请求是一

  • 我试图在与应用程序端口相同的端口上启用执行器endpoint(server.port=8080在application.properties文件中指定),但由于某种原因,它不起作用。当我运行应用程序时,我可以从应用程序返回响应,但不能从执行器endpoint返回响应。我可以看到日志中提到了暴露在基路径“/执行器”下面的endpoint,如下面的屏幕截图所示。但当我尝试点击执行器URL时,它给出了4

  • 在将执行器配置为在不同端口上启动时,应用程序会出现以下StackTrace失败: aop发出以下信息警告: 感谢任何/所有的帮助。 詹姆斯

  • 在EMR集群或任何集群中,YARN有可能在同一个EC2实例中分配驱动程序和执行器吗?我想知道驱动程序是否可以利用1个EC2实例的存储和处理能力,或者该实例的某个部分将用于服务集群中运行的其他spark作业。这可能会导致我的驱动程序内存不足。 我认为资源管理器是根据集群资源的可用性来决定的?

  • 问题内容: XMLHttpRequest可以从http:// mydomain.com/向http:// mydomain.com:81/发送请求吗? 问题答案: 要使两个文档具有相同的来源,协议(http / https),域和端口(默认为80或:xx)必须相同。因此,不能,您不能对其他端口使用xhr。

  • 我想部署一个tomcat服务器,以便它同时侦听两个端口(都用于超文本传输协议)。 为了确保您正确理解这个需求,我们只有一个服务器实例,但希望侦听HTTP协议的两个端口。例如,任何人都可以使用端口号7080和8080访问部署在我的服务器中的应用程序 有可能做到吗?如果可能,我们如何实现这一点?