我有一个 Spring Boot 应用程序和一个 Angular 应用程序。我想从 Spring Boot 应用程序提供 Angular 应用程序。我构建了 Angular 应用程序,并将所有文件(包括 index.html 文件)移动到 /resources/static/ 中,并且确保也移动到 resources/public/ 中。我还将index.html放入resources/templates中。 当调用任何角度路线时,例如,我收到 404 mywebsite.com/login
然后我添加了一个控制器来将所有请求转发到我的 Angular 应用程序:
@Controller
public class RedirectToAngularController {
/**
* Should redirect all routes to FrontEnd, but doesn't work.
*/
@RequestMapping({"/", "/login", "/login/**"})
public String redirectLogin() {
log.info("Forwarding request to Angular (index.html)");
return "forward:/index.html";
}
}
IntelliJ 向我发出“forward:/index.html”警告,指出它找不到 URL:
我仍然部署了我的网站并在
myWebsite.com/login
或 myWebsite.com/confirm
打开它。我在浏览器中看到 forward:/index.html
作为字符串,而不是显示我的 index.html 文件。所以它实际上返回字符串,而不是文件
在日志中出现“将请求转发到 Angular (index.html)”,但随后在下一行中显示:Cannot find GET /index.html
。
所以我删除了该控制器,而是尝试使用 ResourceHandler 来解决这个问题:
@Configuration
public class WebAdapterConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**/*")
.addResourceLocations("classpath:/static/")
.resourceChain(true)
.addResolver(new PathResourceResolver() {
@Override
protected Resource getResource(String resourcePath, Resource location) throws IOException {
Resource requestedResource = location.createRelative(resourcePath);
return requestedResource.exists() && requestedResource.isReadable() ? requestedResource
: new ClassPathResource("/static/index.html");
}
});
registry.setOrder(-1);
}
}
这在此处进行了描述:Springboot/Angular2 - 如何处理 HTML5 url? 也在这里:https://keepgrind.in/java/springboot/make-spring-boot-surrender-routing-control-to-angular/
但这会重定向一切!现在,当我打开 mywebsite.com/login 以及向我的 api 发出邮递员请求时(例如 GET mywebsite.com/api/users),我都会获取索引文件
所以我尝试用
registry.addResourceHandler("/**/*")
或 registry.addResourceHandler("/login")
替换 registry.addResourceHandler("/login/**", "/confirm")
来缩小范围。但只有 mywebsite.com/login/something 和 mywebsite.com/confirm 重新运行 index.html,但所有其他路径(包括 api 方法的 URI)都返回 404!
第三种方法是添加视图控制器:
@Configuration
public class WebAdapterConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("forward:/index.html");
registry.addViewController("/login/**").setViewName("forward:/index.html");
registry.addViewController("/confirm").setViewName("forward:/index.html");
}
}
但后来我的所有路线总是收到 404。
我还将 spring web MVC 添加到我的依赖项中,但这似乎没有改变任何东西。
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
}
附注我不使用 tymeleaf,因为我的文件来自 Angular。也许这就是为什么
forward:/
不起作用?
缩小 ResourceHandler 路径是正确的方法:
registry.addResourceHandler(
"/login/**",
"/all other Uris of my website"
).addResourceLocations("classpath:/static/")
.resourceChain(true)
.addResolver(new PathResourceResolver() {
@Override
protected Resource getResource(String resourcePath, Resource location) throws IOException {
Resource requestedResource = location.createRelative(resourcePath);
return requestedResource.exists() && requestedResource.isReadable() ? requestedResource
: new ClassPathResource("/static/index.html");
}
});
还有一个问题,对于其他 URI 不断返回 404,但这与资源处理程序无关,而是我们网关的问题。
这应该可以解决您的一般问题:)
SpringBoot 会自动检测到这一点,并且适用于各种单页应用程序。
我按照你的回答但没有用。 URL /login 由 Spring Boot 的服务器处理。该服务器不会将 /login 转发到 index.html。你能解释一下你是如何让它发挥作用的吗?我想你需要有一种方法来告诉 Spring Boot 服务器进行转发。