我们正在尝试将我们现有的 Spring WebServices 应用程序迁移到 SpringBoot 并遇到了一个问题,我们寻求您的建议。
我们有一个基本服务 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。
但是我们发现,如果我们在尝试监控健康状况时将 Actuator 健康监控端口设置为与 App 相同的端口,我们会得到 501 Unimplemented 响应。
配置如下:
# 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
我们可以解决这个问题的一种方法是,如果我们将执行器健康检查端口更改为其他可以工作的端口。
问题:我们如何将 Actuator 端口设置为与 App 相同,并使执行器健康检查 url 类似于 http://localhost:8080/manage/health 不会从 Base Service Servlet 返回 501 Unimplemented ?