1717
1818import java .lang .reflect .Field ;
1919import java .util .Arrays ;
20- import java .util .List ;
2120
2221import org .springframework .beans .factory .annotation .Autowired ;
2322import org .springframework .boot .actuate .endpoint .mvc .EndpointHandlerMapping ;
23+ import org .springframework .boot .actuate .endpoint .mvc .EndpointHandlerMappingCustomizer ;
2424import org .springframework .boot .actuate .endpoint .mvc .JolokiaMvcEndpoint ;
2525import org .springframework .boot .autoconfigure .condition .ConditionalOnExpression ;
2626import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
3737import org .springframework .util .ReflectionUtils ;
3838import org .springframework .web .client .RestTemplate ;
3939import org .springframework .web .servlet .DispatcherServlet ;
40- import org .springframework .web .servlet .HandlerInterceptor ;
41- import org .springframework .web .servlet .handler .AbstractHandlerMapping ;
4240import org .springframework .web .servlet .mvc .ServletWrappingController ;
4341
4442import de .codecentric .boot .admin .actuate .LogfileMvcEndpoint ;
4543import de .codecentric .boot .admin .services .SpringBootAdminRegistrator ;
4644import de .codecentric .boot .admin .web .BasicAuthHttpRequestInterceptor ;
47- import de .codecentric .boot .admin .web .EndpointCorsFilter ;
4845import 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 }
0 commit comments