DefaultServletHttpRequestHandler supports DispatcherType.INCLUDE

See gh-30113
This commit is contained in:
Andreas Bergander
2023-03-13 14:47:51 +01:00
committed by rstoyanchev
parent cc296c5033
commit 732f0a6a77
2 changed files with 26 additions and 1 deletions

View File

@@ -18,6 +18,7 @@ package org.springframework.web.servlet.resource;
import java.io.IOException;
import jakarta.servlet.DispatcherType;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
@@ -125,7 +126,12 @@ public class DefaultServletHttpRequestHandler implements HttpRequestHandler, Ser
throw new IllegalStateException("A RequestDispatcher could not be located for the default servlet '" +
this.defaultServletName + "'");
}
rd.forward(request, response);
if (request.getDispatcherType() == DispatcherType.INCLUDE) {
rd.include(request, response);
}
else {
rd.forward(request, response);
}
}
}

View File

@@ -16,6 +16,7 @@
package org.springframework.web.servlet.config.annotation;
import jakarta.servlet.DispatcherType;
import jakarta.servlet.RequestDispatcher;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -88,6 +89,24 @@ public class DefaultServletHandlerConfigurerTests {
assertThat(response.getForwardedUrl()).as("The request was not forwarded").isEqualTo(expected);
}
@Test
public void handleIncludeRequest() throws Exception {
configurer.enable();
SimpleUrlHandlerMapping handlerMapping = configurer.buildHandlerMapping();
DefaultServletHttpRequestHandler handler = (DefaultServletHttpRequestHandler) handlerMapping.getUrlMap().get("/**");
assertThat(handler).isNotNull();
assertThat(handlerMapping.getOrder()).isEqualTo(Integer.MAX_VALUE);
MockHttpServletRequest request = new MockHttpServletRequest();
request.setDispatcherType(DispatcherType.INCLUDE);
handler.handleRequest(request, response);
String expected = "default";
assertThat(servletContext.url).as("The ServletContext was not called with the default servlet name").isEqualTo(expected);
assertThat(response.getIncludedUrl()).as("The request was not included").isEqualTo(expected);
}
private static class DispatchingMockServletContext extends MockServletContext {