Skip to content

Commit 8ee0e78

Browse files
committed
Add Access-Control-Request-Method check for CORS preflight requests
Issue: SPR-13193
1 parent aea23e4 commit 8ee0e78

File tree

3 files changed

+8
-3
lines changed

3 files changed

+8
-3
lines changed

spring-web/src/main/java/org/springframework/web/cors/CorsUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ public static boolean isCorsRequest(HttpServletRequest request) {
4141
* Returns {@code true} if the request is a valid CORS pre-flight one.
4242
*/
4343
public static boolean isPreFlightRequest(HttpServletRequest request) {
44-
return (isCorsRequest(request) && request.getMethod().equals(HttpMethod.OPTIONS.name()));
44+
return (isCorsRequest(request) && request.getMethod().equals(HttpMethod.OPTIONS.name())
45+
&& request.getHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD) != null);
4546
}
4647

4748
}

spring-web/src/test/java/org/springframework/web/cors/CorsUtilsTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.junit.Test;
2222

2323
import org.springframework.http.HttpHeaders;
24+
import org.springframework.http.HttpMethod;
2425
import org.springframework.mock.web.test.MockHttpServletRequest;
2526

2627
/**
@@ -46,7 +47,7 @@ public void isNotCorsRequest() {
4647
@Test
4748
public void isPreFlightRequest() {
4849
MockHttpServletRequest request = new MockHttpServletRequest();
49-
request.setMethod("OPTIONS");
50+
request.setMethod(HttpMethod.OPTIONS.name());
5051
request.addHeader(HttpHeaders.ORIGIN, "http://domain.com");
5152
request.addHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET");
5253
assertTrue(CorsUtils.isPreFlightRequest(request));
@@ -58,10 +59,12 @@ public void isNotPreFlightRequest() {
5859
assertFalse(CorsUtils.isPreFlightRequest(request));
5960

6061
request = new MockHttpServletRequest();
62+
request.setMethod(HttpMethod.OPTIONS.name());
6163
request.addHeader(HttpHeaders.ORIGIN, "http://domain.com");
6264
assertFalse(CorsUtils.isPreFlightRequest(request));
6365

6466
request = new MockHttpServletRequest();
67+
request.setMethod(HttpMethod.OPTIONS.name());
6568
request.addHeader(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET");
6669
assertFalse(CorsUtils.isPreFlightRequest(request));
6770
}

spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import org.springframework.web.context.support.ServletRequestHandledEvent;
6262
import org.springframework.web.context.support.WebApplicationContextUtils;
6363
import org.springframework.web.context.support.XmlWebApplicationContext;
64+
import org.springframework.web.cors.CorsUtils;
6465
import org.springframework.web.util.NestedServletException;
6566
import org.springframework.web.util.WebUtils;
6667

@@ -903,7 +904,7 @@ protected final void doDelete(HttpServletRequest request, HttpServletResponse re
903904
protected void doOptions(HttpServletRequest request, HttpServletResponse response)
904905
throws ServletException, IOException {
905906

906-
if (this.dispatchOptionsRequest || request.getHeader("Origin") != null) {
907+
if (this.dispatchOptionsRequest || CorsUtils.isPreFlightRequest(request)) {
907908
processRequest(request, response);
908909
if (response.containsHeader("Allow")) {
909910
// Proper OPTIONS response coming from a handler - we're done.

0 commit comments

Comments
 (0)