Skip to content

Commit 53964c2

Browse files
committed
Setup CORS with a filter by default
1 parent 6c64326 commit 53964c2

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

grails-core/src/main/groovy/grails/config/Settings.groovy

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,5 +214,9 @@ interface Settings {
214214
* Whether to execute Bootstrap classes
215215
*/
216216
String SETTING_SKIP_BOOTSTRAP = "grails.bootstrap.skip";
217+
/**
218+
* Whether to load cors configuration via a filter (true) or interceptor(false)
219+
*/
220+
String SETTING_CORS_FILTER = "grails.cors.filter";
217221

218222
}

grails-plugin-url-mappings/src/main/groovy/org/grails/plugins/web/mapping/UrlMappingsGrailsPlugin.groovy

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import grails.util.Environment
2121
import grails.util.GrailsUtil
2222
import grails.web.CamelCaseUrlConverter
2323
import grails.web.HyphenatedUrlConverter
24+
import grails.web.mapping.cors.GrailsCorsFilter
2425
import groovy.transform.CompileDynamic
2526
import groovy.transform.CompileStatic
2627
import org.grails.core.artefact.UrlMappingsArtefactHandler
@@ -37,7 +38,9 @@ import org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter
3738
import org.grails.web.mapping.servlet.UrlMappingsErrorPageCustomizer
3839
import org.springframework.aop.framework.ProxyFactoryBean
3940
import org.springframework.aop.target.HotSwappableTargetSource
41+
import org.springframework.boot.web.servlet.FilterRegistrationBean
4042
import org.springframework.context.ApplicationContext
43+
import org.springframework.core.Ordered
4144

4245
/**
4346
* Handles the configuration of URL mappings.
@@ -67,11 +70,20 @@ class UrlMappingsGrailsPlugin extends Plugin {
6770

6871
"${grails.web.UrlConverter.BEAN_NAME}"('hyphenated' == urlConverterType ? HyphenatedUrlConverter : CamelCaseUrlConverter)
6972

73+
boolean corsFilterEnabled = config.getProperty(Settings.SETTING_CORS_FILTER, Boolean, true)
74+
7075
grailsCorsConfiguration(GrailsCorsConfiguration)
7176

7277
urlMappingsHandlerMapping(UrlMappingsHandlerMapping, ref("grailsUrlMappingsHolder")) {
73-
grailsCorsConfiguration = ref("grailsCorsConfiguration")
78+
if (!corsFilterEnabled) {
79+
grailsCorsConfiguration = ref("grailsCorsConfiguration")
80+
}
7481
}
82+
83+
if (corsFilterEnabled) {
84+
grailsCorsFilter(GrailsCorsFilter, ref("grailsCorsConfiguration"))
85+
}
86+
7587
urlMappingsInfoHandlerAdapter(UrlMappingsInfoHandlerAdapter)
7688
urlMappingsErrorPageCustomizer(UrlMappingsErrorPageCustomizer)
7789
grailsLinkGenerator(cacheUrls ? CachingLinkGenerator : DefaultLinkGenerator, serverURL)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package grails.web.mapping.cors
2+
3+
import org.springframework.core.Ordered
4+
import org.springframework.web.cors.CorsConfiguration
5+
import org.springframework.web.cors.UrlBasedCorsConfigurationSource
6+
import org.springframework.web.filter.CorsFilter
7+
8+
/**
9+
* Created by jameskleeh on 10/20/16.
10+
*/
11+
class GrailsCorsFilter extends CorsFilter implements Ordered {
12+
13+
public GrailsCorsFilter(GrailsCorsConfiguration corsConfiguration) {
14+
super(configurationSource(corsConfiguration.corsConfigurations))
15+
}
16+
17+
private static UrlBasedCorsConfigurationSource configurationSource(Map<String, CorsConfiguration> corsConfigurations) {
18+
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource()
19+
corsConfigurations.each { String key, CorsConfiguration config ->
20+
source.registerCorsConfiguration(key, config)
21+
}
22+
source
23+
}
24+
25+
@Override
26+
int getOrder() {
27+
HIGHEST_PRECEDENCE
28+
}
29+
}

0 commit comments

Comments
 (0)