我使用
spring-boot-starter-jetty
和 actuator
制作了一个 Spring Boot 3 应用程序,其中 server.port != management.server.port
。
我希望服务器和管理端口上都不允许 TRACE 调用。
我尝试了多种方法,但我设法只阻止服务器端口的 TRACE,而 mgmt 端口上的服务器始终接受带有 200 OK 的 TRACE 调用。
跟进这个 Spring Boot 问题 ref
我做了以下测试应用程序来展示我所看到的
测试testTraceDisabledManagement不会通过
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ ├── demo
│ │ │ │ ├── CustomDispatcherServlet.java
│ │ │ │ └── DemoApplication.java
│ │ │ └── server
│ │ │ └── MgmtServerConfiguration.java
│ │ └── resources
│ │ ├── META-INF
│ │ │ └── spring
│ │ │ └── org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports
│ │ ├── application.properties
│ │ ├── static
│ │ └── templates
│ └── test
│ └── java
│ └── com
│ └── example
│ └── demo
│ └── DemoApplicationTests.java
测试
@Test
public void testTraceDisabledApi() throws URISyntaxException {
verifyTraceFails(this.apiPort); // OK - Jetty returns 405
}
/**
* Tests that TRACE is disabled for the management endpoint.
*/
@Test
public void testTraceDisabledManagement() throws URISyntaxException {
verifyTraceFails(this.managementPort); // KO - Jetty returns 200
}
private void verifyTraceFails(final int port) throws URISyntaxException {
final String url = "http://localhost:" + port;
RestTemplate restTemplate = new RestTemplate();
try {
RequestEntity<Void> requestEntity = new RequestEntity<>(TRACE, new URI(url));
ResponseEntity<String> response = restTemplate.exchange(requestEntity, String.class);
assertThat(response.getStatusCode(), Matchers.equalTo(METHOD_NOT_ALLOWED));
}
catch (org.springframework.web.client.HttpClientErrorException e) {
assertThat(e.getStatusCode(), Matchers.equalTo(METHOD_NOT_ALLOWED));
return;
}
catch (Exception e) {
Assertions.fail("Should never reach this point", e);
}
Assertions.fail("Should never reach this point");
}
我明白了问题所在。我使用 JettyServerCustomizer 类来配置 Jetty,但它似乎被管理服务器忽略了。
WebServerFactoryCustomizer 做到了这一点。
主帖中的项目已更新,并且测试正在通过。
- JettyServerCustomizer mgmtJettyServerCustomizer() {
- return (server) -> {
- ServletContextHandler servletContextHandler = findServletContextHandler(server);
- disableTraceMethodForHandler(servletContextHandler);
+ WebServerFactoryCustomizer<JettyServletWebServerFactory> disableSniHostCheck() {
+ return (factory) -> {
+ factory.addServerCustomizers((server) -> {
+ ServletContextHandler servletContextHandler = findServletContextHandler(server);
+ disableTraceMethodForHandler(servletContextHandler);
+ });