Skip to content

Commit 2076c6a

Browse files
authored
1849: fix forwarding filter for webflux base-paths (codecentric#1853)
* 1849: fix forwarding filter for webflux base-paths * 1849: fix include-filters when webflux base-paths is configured * 1849: simplify include-filters when webflux base-paths is configured
1 parent ee8825a commit 2076c6a

File tree

4 files changed

+63
-21
lines changed

4 files changed

+63
-21
lines changed

spring-boot-admin-server-ui/pom.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@
132132
<includeEmptyDirs>true</includeEmptyDirs>
133133
</configuration>
134134
</plugin>
135+
135136
</plugins>
136137
<resources>
137138
<resource>
@@ -144,4 +145,20 @@
144145
</resource>
145146
</resources>
146147
</build>
148+
<profiles>
149+
<profile>
150+
<id>noNpm</id>
151+
<build>
152+
<plugins>
153+
<plugin>
154+
<groupId>com.github.eirslett</groupId>
155+
<artifactId>frontend-maven-plugin</artifactId>
156+
<configuration>
157+
<skip>true</skip>
158+
</configuration>
159+
</plugin>
160+
</plugins>
161+
</build>
162+
</profile>
163+
</profiles>
147164
</project>

spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/config/AdminServerUiAutoConfiguration.java

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2929
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3030
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
31+
import org.springframework.boot.autoconfigure.web.reactive.WebFluxProperties;
3132
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3233
import org.springframework.context.ApplicationContext;
3334
import org.springframework.context.annotation.Bean;
@@ -124,20 +125,6 @@ public SpringResourceTemplateResolver adminTemplateResolver() {
124125
return resolver;
125126
}
126127

127-
@Bean
128-
public HomepageForwardingFilterConfig homepageForwardingFilterConfig() throws IOException {
129-
String homepage = this.adminServer.path("/");
130-
131-
List<String> extensionRoutes = new UiRoutesScanner(this.applicationContext)
132-
.scan(this.adminUi.getExtensionResourceLocations());
133-
List<String> routesIncludes = Stream.concat(DEFAULT_UI_ROUTES.stream(), extensionRoutes.stream())
134-
.map(this.adminServer::path).collect(Collectors.toList());
135-
List<String> routesExcludes = DEFAULT_UI_ROUTE_EXCLUDES.stream().map(this.adminServer::path)
136-
.collect(Collectors.toList());
137-
138-
return new HomepageForwardingFilterConfig(homepage, routesIncludes, routesExcludes);
139-
}
140-
141128
@Configuration(proxyBeanMethods = false)
142129
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
143130
public static class ReactiveUiConfiguration {
@@ -149,15 +136,36 @@ public static class AdminUiWebfluxConfig implements WebFluxConfigurer {
149136

150137
private final AdminServerProperties adminServer;
151138

139+
private final WebFluxProperties webFluxProperties;
140+
152141
private final ApplicationContext applicationContext;
153142

154143
public AdminUiWebfluxConfig(AdminServerUiProperties adminUi, AdminServerProperties adminServer,
155-
ApplicationContext applicationContext) {
144+
WebFluxProperties webFluxProperties, ApplicationContext applicationContext) {
156145
this.adminUi = adminUi;
157146
this.adminServer = adminServer;
147+
this.webFluxProperties = webFluxProperties;
158148
this.applicationContext = applicationContext;
159149
}
160150

151+
@Bean
152+
public HomepageForwardingFilterConfig homepageForwardingFilterConfig() throws IOException {
153+
String webFluxBasePath = webFluxProperties.getBasePath();
154+
boolean webfluxBasePathSet = webFluxBasePath != null;
155+
String homepage = webfluxBasePathSet ? webFluxBasePath + "/" : this.adminServer.path("/");
156+
157+
List<String> extensionRoutes = new UiRoutesScanner(this.applicationContext)
158+
.scan(this.adminUi.getExtensionResourceLocations());
159+
List<String> routesIncludes = Stream.concat(DEFAULT_UI_ROUTES.stream(), extensionRoutes.stream())
160+
.map(this.adminServer::path).collect(Collectors.toList());
161+
routesIncludes.add("");
162+
163+
List<String> routesExcludes = DEFAULT_UI_ROUTE_EXCLUDES.stream().map(this.adminServer::path)
164+
.collect(Collectors.toList());
165+
166+
return new HomepageForwardingFilterConfig(homepage, routesIncludes, routesExcludes);
167+
}
168+
161169
@Override
162170
public void addResourceHandlers(org.springframework.web.reactive.config.ResourceHandlerRegistry registry) {
163171
registry.addResourceHandler(this.adminServer.path("/**"))
@@ -200,6 +208,20 @@ public AdminUiWebMvcConfig(AdminServerUiProperties adminUi, AdminServerPropertie
200208
this.applicationContext = applicationContext;
201209
}
202210

211+
@Bean
212+
public HomepageForwardingFilterConfig homepageForwardingFilterConfig() throws IOException {
213+
String homepage = this.adminServer.path("/");
214+
215+
List<String> extensionRoutes = new UiRoutesScanner(this.applicationContext)
216+
.scan(this.adminUi.getExtensionResourceLocations());
217+
List<String> routesIncludes = Stream.concat(DEFAULT_UI_ROUTES.stream(), extensionRoutes.stream())
218+
.map(this.adminServer::path).collect(Collectors.toList());
219+
List<String> routesExcludes = DEFAULT_UI_ROUTE_EXCLUDES.stream().map(this.adminServer::path)
220+
.collect(Collectors.toList());
221+
222+
return new HomepageForwardingFilterConfig(homepage, routesIncludes, routesExcludes);
223+
}
224+
203225
@Override
204226
public void addResourceHandlers(
205227
org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry registry) {

spring-boot-admin-server-ui/src/main/java/de/codecentric/boot/admin/server/ui/web/HomepageForwardingFilterConfig.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,13 @@
2323
@Value
2424
public class HomepageForwardingFilterConfig {
2525

26-
private final String homepage;
26+
String homepage;
2727

28-
private final List<String> routesIncludes;
28+
List<String> routesIncludes;
2929

30-
private final List<String> routesExcludes;
30+
/**
31+
* routes which are excluded intentionally (for instance downloads)
32+
*/
33+
List<String> routesExcludes;
3134

3235
}

spring-boot-admin-server-ui/src/test/java/de/codecentric/boot/admin/server/ui/config/AdminServerUiAutoConfigurationTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.mockito.Mock;
2828
import org.mockito.junit.jupiter.MockitoExtension;
2929
import org.springframework.boot.autoconfigure.AutoConfigurations;
30+
import org.springframework.boot.autoconfigure.web.reactive.WebFluxProperties;
3031
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
3132
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
3233
import org.springframework.http.HttpHeaders;
@@ -57,9 +58,8 @@ public class AdminServerUiAutoConfigurationTest implements WithAssertions {
5758
public class ReactiveUiConfigurationTest {
5859

5960
private final ReactiveWebApplicationContextRunner contextRunner = new ReactiveWebApplicationContextRunner()
60-
.withPropertyValues("--spring.boot.admin.ui.available-languages=de",
61-
"--spring.boot.admin.contextPath=test")
62-
.withBean(AdminServerProperties.class)
61+
.withPropertyValues("--spring.boot.admin.ui.available-languages=de", "--spring.webflux.base-path=test")
62+
.withBean(AdminServerProperties.class).withBean(WebFluxProperties.class)
6363
.withConfiguration(AutoConfigurations.of(AdminServerUiAutoConfiguration.class));
6464

6565
@Mock

0 commit comments

Comments
 (0)