Avoid adding Jetty's upgrade filter to non-Jetty servers

Fixes gh-38181
This commit is contained in:
Andy Wilkinson 2023-11-08 17:52:39 +00:00
parent 445d0a22db
commit b6a9c67719
2 changed files with 21 additions and 9 deletions

View File

@ -34,7 +34,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWarDeplo
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
@ -91,13 +92,15 @@ public class WebSocketServletAutoConfiguration {
@Bean
@ConditionalOnNotWarDeployment
@Order(Ordered.LOWEST_PRECEDENCE)
@ConditionalOnMissingBean(name = "websocketUpgradeFilterServletContextInitializer")
ServletContextInitializer websocketUpgradeFilterServletContextInitializer() {
return (servletContext) -> {
Dynamic registration = servletContext.addFilter(WebSocketUpgradeFilter.class.getName(),
new WebSocketUpgradeFilter());
registration.setAsyncSupported(true);
registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/*");
@ConditionalOnMissingBean(name = "websocketUpgradeFilterWebServerCustomizer")
WebServerFactoryCustomizer<JettyServletWebServerFactory> websocketUpgradeFilterWebServerCustomizer() {
return (factory) -> {
factory.addInitializers((servletContext) -> {
Dynamic registration = servletContext.addFilter(WebSocketUpgradeFilter.class.getName(),
new WebSocketUpgradeFilter());
registration.setAsyncSupported(true);
registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/*");
});
};
}

View File

@ -108,7 +108,7 @@ class WebSocketServletAutoConfigurationTests {
@Test
@Servlet5ClassPathOverrides
void jettyWebSocketUpgradeFilterIsAddedToServletContext() {
void jettyWebSocketUpgradeFilterIsAddedToServletContextOfJettyServer() {
try (AnnotationConfigServletWebServerApplicationContext context = new AnnotationConfigServletWebServerApplicationContext(
JettyConfiguration.class, WebSocketServletAutoConfiguration.JettyWebSocketConfiguration.class)) {
assertThat(context.getServletContext().getFilterRegistration(WebSocketUpgradeFilter.class.getName()))
@ -116,6 +116,15 @@ class WebSocketServletAutoConfigurationTests {
}
}
@Test
void jettyWebSocketUpgradeFilterIsNotAddedToServletContextOfTomcatServer() {
try (AnnotationConfigServletWebServerApplicationContext context = new AnnotationConfigServletWebServerApplicationContext(
TomcatConfiguration.class, WebSocketServletAutoConfiguration.JettyWebSocketConfiguration.class)) {
assertThat(context.getServletContext().getFilterRegistration(WebSocketUpgradeFilter.class.getName()))
.isNull();
}
}
@Test
@SuppressWarnings("rawtypes")
void jettyWebSocketUpgradeFilterIsNotExposedAsABean() {