我正在为一个基于react的单页面应用程序开发一个spring后端,我使用react-router进行客户端路由。
在index.html页面旁边,后端在路径/api/**
上提供数据。
为了从应用程序的根路径/
上的src/main/resources/public/index.html
提供index.html,我添加了一个资源处理程序
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/").addResourceLocations("/index.html");
}
我想做的是在没有其他路由匹配的时候提供index.html页面,例如,当我调用/api
以外的路径时。
如何在 Spring 配置这种全方位路由?
9条答案
按热度按时间pkbketx91#
由于我的react应用程序可以使用根作为转发目标,这最终为我工作
老实说,我不知道为什么它必须完全在这个特定的格式,以避免无限转发循环。
c9x0cxw02#
我在Sping Boot 应用程序中托管了一个基于聚合物的PWA,沿着静态Web资源(如图像),以及“/API/."下的REST API。我希望客户端应用程序处理PWA的URL路由。以下是我的用途:
这也适用于Angular和React应用程序。
c6ubokkw3#
避免@EnableWebMvc
默认情况下,Spring-Boot在
src/main/resources
中提供静态内容:看看this和this;
或保留@EnableWebMvc并覆盖addViewControllers
你指定了
@EnableWebMvc
吗?看看这个:Java Spring Boot: How to map my app root (“/”) to index.html?要么删除@EnableWebMvc,要么重新定义
addViewControllers
:或者定义一个Controller来捕获
/
你可以看看这个spring-boot-reactjs sample project on github:
它可以使用控制器做你想做的事情:
其
index.html
低于src/main/resources/templates
3mpgtkmj4#
我在我的spring Boot 应用程序中使用react和react-router,它就像创建一个Map到
/
和我网站的子树(如/users/**
)的控制器一样简单。API调用不会被这个控制器捕获,资源会被自动处理。
ryoqjall5#
通过观察这个问题找到了答案
btxsgosb6#
另一种解决方案(更改/添加/删除
myurl1
,myurl2
,...与您的路由):**注意:**使用
public String index()
也可以,但前提是使用模板。WebMvcConfigurerAdapter
已弃用。dphi5xsq7#
经过多次尝试,我发现下面的解决方案是最简单的。它基本上可以绕过所有的Spring处理,这是很难处理的。
brc7rcf08#
为了回答你的具体问题,其中涉及在所有情况下提供单页应用程序(SPA)除了/API**路线这里是我做了修改Petri的答案。
我有一个名为polymer的模板,其中包含SPA的index.html。因此,挑战变成了让我们将除了/API和/public-API之外的所有路由转发到该视图。
在我的WebMvcConfigurerAdapter中,我覆盖了addViewControllers并使用了正则表达式:^((?!/API/|/public-api/).)$
在本例中,您需要正则表达式:^((?!/API/).)$
这导致能够命中http://localhost或http://localhost/community来提供我的SPA,SPA进行的所有其余调用都被成功路由到http://localhost/api/posts、http://localhost/public-api/posts等。
1zmg4dgp9#
我想分享一个基于Jurass答案的解决方案。
Sping Boot 3.1 + SPA Angular应用程序在
/resources/static
文件夹中。下面是过滤器:
以及它如何在Spring Security过滤器链中使用:
所有不是API调用或静态资源的请求都将被转发到
/index.html
页面,因此Angular可以接管路由过程。