@ -1,5 +1,5 @@
/ *
/ *
* Copyright 2002 - 2018 the original author or authors .
* Copyright 2002 - 2019 the original author or authors .
*
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
* you may not use this file except in compliance with the License .
@ -19,7 +19,6 @@ package org.springframework.web.cors;
import java.io.IOException ;
import java.io.IOException ;
import java.nio.charset.StandardCharsets ;
import java.nio.charset.StandardCharsets ;
import java.util.ArrayList ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.List ;
import java.util.List ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
import javax.servlet.http.HttpServletResponse ;
@ -36,7 +35,6 @@ import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.http.server.ServletServerHttpResponse ;
import org.springframework.http.server.ServletServerHttpResponse ;
import org.springframework.lang.Nullable ;
import org.springframework.lang.Nullable ;
import org.springframework.util.CollectionUtils ;
import org.springframework.util.CollectionUtils ;
import org.springframework.web.util.WebUtils ;
/ * *
/ * *
* The default implementation of { @link CorsProcessor } , as defined by the
* The default implementation of { @link CorsProcessor } , as defined by the
@ -45,8 +43,7 @@ import org.springframework.web.util.WebUtils;
* < p > Note that when input { @link CorsConfiguration } is { @code null } , this
* < p > Note that when input { @link CorsConfiguration } is { @code null } , this
* implementation does not reject simple or actual requests outright but simply
* implementation does not reject simple or actual requests outright but simply
* avoid adding CORS headers to the response . CORS processing is also skipped
* avoid adding CORS headers to the response . CORS processing is also skipped
* if the response already contains CORS headers , or if the request is detected
* if the response already contains CORS headers .
* as a same - origin one .
*
*
* @author Sebastien Deleuze
* @author Sebastien Deleuze
* @author Rossen Stoyanchev
* @author Rossen Stoyanchev
@ -62,26 +59,23 @@ public class DefaultCorsProcessor implements CorsProcessor {
public boolean processRequest ( @Nullable CorsConfiguration config , HttpServletRequest request ,
public boolean processRequest ( @Nullable CorsConfiguration config , HttpServletRequest request ,
HttpServletResponse response ) throws IOException {
HttpServletResponse response ) throws IOException {
response . addHeader ( HttpHeaders . VARY , HttpHeaders . ORIGIN ) ;
response . addHeader ( HttpHeaders . VARY , HttpHeaders . ACCESS_CONTROL_REQUEST_METHOD ) ;
response . addHeader ( HttpHeaders . VARY , HttpHeaders . ACCESS_CONTROL_REQUEST_HEADERS ) ;
if ( ! CorsUtils . isCorsRequest ( request ) ) {
if ( ! CorsUtils . isCorsRequest ( request ) ) {
return true ;
return true ;
}
}
ServletServerHttpResponse serverResponse = new ServletServerHttpResponse ( response ) ;
if ( response . getHeader ( HttpHeaders . ACCESS_CONTROL_ALLOW_ORIGIN ) ! = null ) {
if ( responseHasCors ( serverResponse ) ) {
logger . trace ( "Skip: response already contains \"Access-Control-Allow-Origin\"" ) ;
logger . trace ( "Skip: response already contains \"Access-Control-Allow-Origin\"" ) ;
return true ;
return true ;
}
}
ServletServerHttpRequest serverRequest = new ServletServerHttpRequest ( request ) ;
if ( WebUtils . isSameOrigin ( serverRequest ) ) {
logger . trace ( "Skip: request is from same origin" ) ;
return true ;
}
boolean preFlightRequest = CorsUtils . isPreFlightRequest ( request ) ;
boolean preFlightRequest = CorsUtils . isPreFlightRequest ( request ) ;
if ( config = = null ) {
if ( config = = null ) {
if ( preFlightRequest ) {
if ( preFlightRequest ) {
rejectRequest ( serverResponse ) ;
rejectRequest ( new ServletServerHttpResponse ( response ) ) ;
return false ;
return false ;
}
}
else {
else {
@ -89,17 +83,7 @@ public class DefaultCorsProcessor implements CorsProcessor {
}
}
}
}
return handleInternal ( serverRequest , serverResponse , config , preFlightRequest ) ;
return handleInternal ( new ServletServerHttpRequest ( request ) , new ServletServerHttpResponse ( response ) , config , preFlightRequest ) ;
}
private boolean responseHasCors ( ServerHttpResponse response ) {
try {
return ( response . getHeaders ( ) . getAccessControlAllowOrigin ( ) ! = null ) ;
}
catch ( NullPointerException npe ) {
// SPR-11919 and https://issues.jboss.org/browse/WFLY-3474
return false ;
}
}
}
/ * *
/ * *
@ -110,6 +94,7 @@ public class DefaultCorsProcessor implements CorsProcessor {
protected void rejectRequest ( ServerHttpResponse response ) throws IOException {
protected void rejectRequest ( ServerHttpResponse response ) throws IOException {
response . setStatusCode ( HttpStatus . FORBIDDEN ) ;
response . setStatusCode ( HttpStatus . FORBIDDEN ) ;
response . getBody ( ) . write ( "Invalid CORS request" . getBytes ( StandardCharsets . UTF_8 ) ) ;
response . getBody ( ) . write ( "Invalid CORS request" . getBytes ( StandardCharsets . UTF_8 ) ) ;
response . flush ( ) ;
}
}
/ * *
/ * *
@ -122,9 +107,6 @@ public class DefaultCorsProcessor implements CorsProcessor {
String allowOrigin = checkOrigin ( config , requestOrigin ) ;
String allowOrigin = checkOrigin ( config , requestOrigin ) ;
HttpHeaders responseHeaders = response . getHeaders ( ) ;
HttpHeaders responseHeaders = response . getHeaders ( ) ;
responseHeaders . addAll ( HttpHeaders . VARY , Arrays . asList ( HttpHeaders . ORIGIN ,
HttpHeaders . ACCESS_CONTROL_REQUEST_METHOD , HttpHeaders . ACCESS_CONTROL_REQUEST_HEADERS ) ) ;
if ( allowOrigin = = null ) {
if ( allowOrigin = = null ) {
logger . debug ( "Reject: '" + requestOrigin + "' origin is not allowed" ) ;
logger . debug ( "Reject: '" + requestOrigin + "' origin is not allowed" ) ;
rejectRequest ( response ) ;
rejectRequest ( response ) ;