我正在将单页应用程序集成到Spring Boot项目中。 UI(SPA)的上下文为http://localhost:8080/ui/
Spring Boot应用程序本身的上下文为http://localhost:8080/。控制器具有与UI上下文无关的不同上下文。
在某些情况下,UI会将浏览器地址行更改为服务器不知道但不向服务器发送请求的URL。之后,如果刷新页面,服务器将响应404。但是,我需要返回默认的index.html页面。
示例:我转到http://localhost:8080/ui/,UI将其更改为http://localhost:8080/ui/mainpage。我刷新页面并得到404。
我找到了类似的question,但是我想做些不同的事情,然后在那回答。
当有对http://localhost:8080/ui/ **的请求时,我需要返回默认资源(index.html),如果对http://localhost:8080/context1/blablabla进行了请求,我想返回404。
在调试和搜索之后,我有了下一个解决方案:
@Configuration
public static class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/ui/**")
.addResourceLocations("/ui/")
.resourceChain(false)
.addResolver(new PathResourceResolver() {
@Override
protected Resource getResource(String resourcePath, Resource location) throws IOException {
Resource resource = super.getResource(resourcePath, location);
return Objects.isNull(resource) ? super.getResource("index.html", location) : resource;
}
});
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/ui/").setViewName("index.html");
}
}
此处的方法是手动添加PathResourceResolve并覆盖其方法getResource,因此当resource为null时,请调用index.html resource。这样,我可以确定只有在向http://localhost:8080/ui/ **发出请求时,我才返回默认页面,而所有其他请求将照常返回404。
我认为这不是正确的解决方案,在我看来,这就像黑客一样。我以为资源处理程序可能具有默认资源之类的配置,但是我没有发现任何有关此的信息。
我的问题是如何正确执行? 感谢任何建议。