Skip to content

Commit 340078e

Browse files
author
Johannes Stelzer
committed
Use HandlerInterceptor so CORS-Headers are only served on Endpoints
1 parent 5e0c6d7 commit 340078e

File tree

2 files changed

+31
-134
lines changed

2 files changed

+31
-134
lines changed

spring-boot-starter-admin-client/src/main/java/de/codecentric/boot/admin/config/SpringBootAdminClientAutoConfiguration.java

Lines changed: 31 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717

1818
import java.lang.reflect.Field;
1919
import java.util.Arrays;
20-
import java.util.List;
2120

2221
import org.springframework.beans.factory.annotation.Autowired;
2322
import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping;
23+
import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMappingCustomizer;
2424
import org.springframework.boot.actuate.endpoint.mvc.JolokiaMvcEndpoint;
2525
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
2626
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -37,14 +37,11 @@
3737
import org.springframework.util.ReflectionUtils;
3838
import org.springframework.web.client.RestTemplate;
3939
import org.springframework.web.servlet.DispatcherServlet;
40-
import org.springframework.web.servlet.HandlerInterceptor;
41-
import org.springframework.web.servlet.handler.AbstractHandlerMapping;
4240
import org.springframework.web.servlet.mvc.ServletWrappingController;
4341

4442
import de.codecentric.boot.admin.actuate.LogfileMvcEndpoint;
4543
import de.codecentric.boot.admin.services.SpringBootAdminRegistrator;
4644
import de.codecentric.boot.admin.web.BasicAuthHttpRequestInterceptor;
47-
import de.codecentric.boot.admin.web.EndpointCorsFilter;
4845
import de.codecentric.boot.admin.web.EndpointCorsInterceptor;
4946

5047
/**
@@ -108,14 +105,19 @@ public LogfileMvcEndpoint logfileEndpoint() {
108105
}
109106
}
110107

108+
@Bean
109+
protected EndpointCorsInterceptor endpointCorsInterceptor() {
110+
return new EndpointCorsInterceptor();
111+
}
111112

112-
/**
113-
* HTTP filter to enable Cross-Origin Resource Sharing.
114-
*/
115113
@Bean
116-
@ConditionalOnMissingBean
117-
public EndpointCorsFilter endpointCorsFilter(EndpointHandlerMapping endpointHandlerMapping) {
118-
return new EndpointCorsFilter(endpointHandlerMapping);
114+
protected EndpointHandlerMappingCustomizer endpointHandlerMappingCustomizer() {
115+
return new EndpointHandlerMappingCustomizer() {
116+
@Override
117+
public void customize(EndpointHandlerMapping mapping) {
118+
mapping.setInterceptors(new Object[] { endpointCorsInterceptor() });
119+
}
120+
};
119121
}
120122

121123
@Autowired
@@ -124,55 +126,32 @@ public EndpointCorsFilter endpointCorsFilter(EndpointHandlerMapping endpointHand
124126
@Bean
125127
public ApplicationListener<EmbeddedServletContainerInitializedEvent> appListener() {
126128
/*
127-
* In case a second servletContainer is fired up (because server.port !=
128-
* managament port), there is no viable way to register the endpointCorsFilter.
129-
*
130-
* Instead we register an HandlerInterceptor for the Endpoint handler mapping and
131129
* Set jolokias AgentServlet to support Options request and the Dispatcher servlet
132-
* to forward such.
133-
* Also @see https://github.com/spring-projects/spring-boot/issues/1987
130+
* to forward such. Done in this nasty way in case a second servlet-container is
131+
* spun up, when management.port != server.port Also @see
132+
* https://github.com/spring-projects/spring-boot/issues/1987
134133
*/
135134
return new ApplicationListener<EmbeddedServletContainerInitializedEvent>() {
136135
@Override
137136
public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
138-
if ("management".equals(event.getApplicationContext().getNamespace())) {
139-
// register HandlerIntercepor
140-
for (EndpointHandlerMapping handlerMapping : event.getApplicationContext()
141-
.getBeansOfType(EndpointHandlerMapping.class).values()) {
142-
try {
143-
Field interceptorsField = AbstractHandlerMapping.class.getDeclaredField("adaptedInterceptors");
144-
interceptorsField.setAccessible(true);
145-
@SuppressWarnings("unchecked")
146-
List<HandlerInterceptor> adaptedInterceptors = (List<HandlerInterceptor>) interceptorsField
147-
.get(handlerMapping);
148-
EndpointCorsInterceptor interceptor = new EndpointCorsInterceptor();
149-
event.getApplicationContext().getBeanFactory().autowireBean(interceptor);
150-
adaptedInterceptors.add(interceptor);
151-
}
152-
catch (Exception ex) {
153-
throw new RuntimeException("Couldn't add handlerInterceptor for cors", ex);
154-
}
155-
}
137+
// set DispatcherServlet to forward OptionsRequest
138+
for (DispatcherServlet servlet : event.getApplicationContext()
139+
.getBeansOfType(DispatcherServlet.class).values()) {
140+
servlet.setDispatchOptionsRequest(true);
141+
}
156142

157-
// set DispatcherServlet to forward OptionsRequest
158-
for (DispatcherServlet servlet : event.getApplicationContext()
159-
.getBeansOfType(DispatcherServlet.class).values()) {
160-
servlet.setDispatchOptionsRequest(true);
143+
// set Jolokias ServletWrappingController to support OPTIONS
144+
for (JolokiaMvcEndpoint jolokiaMvcEndpoint : SpringBootAdminClientAutoConfiguration.this.applicationContext
145+
.getBeansOfType(JolokiaMvcEndpoint.class).values()) {
146+
try {
147+
Field controllerField = JolokiaMvcEndpoint.class.getDeclaredField("controller");
148+
ReflectionUtils.makeAccessible(controllerField);
149+
ServletWrappingController controller = (ServletWrappingController) controllerField
150+
.get(jolokiaMvcEndpoint);
151+
controller.setSupportedMethods("GET", "HEAD", "POST", "OPTIONS");
161152
}
162-
163-
// set Jolokias ServletWrappingController to support OPTIONS
164-
for (JolokiaMvcEndpoint jolokiaMvcEndpoint : SpringBootAdminClientAutoConfiguration.this.applicationContext
165-
.getBeansOfType(JolokiaMvcEndpoint.class).values()) {
166-
try {
167-
Field controllerField = JolokiaMvcEndpoint.class.getDeclaredField("controller");
168-
ReflectionUtils.makeAccessible(controllerField);
169-
ServletWrappingController controller = (ServletWrappingController) controllerField
170-
.get(jolokiaMvcEndpoint);
171-
controller.setSupportedMethods("GET", "HEAD", "POST", "OPTIONS");
172-
}
173-
catch (Exception ex) {
174-
throw new RuntimeException("Couldn't reconfigure servletWrappingController for Jolokia", ex);
175-
}
153+
catch (Exception ex) {
154+
throw new RuntimeException("Couldn't reconfigure servletWrappingController for Jolokia", ex);
176155
}
177156
}
178157
}

spring-boot-starter-admin-client/src/main/java/de/codecentric/boot/admin/web/EndpointCorsFilter.java

Lines changed: 0 additions & 82 deletions
This file was deleted.

0 commit comments

Comments
 (0)