Angular + Spring Boot:将所有 Angular 路由转发到 Angular,并将所有 API 转发到 Spring 控制器

问题描述 投票:0回答:3

我有一个 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:

warning

我仍然部署了我的网站并在

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:/
不起作用?

java angular spring-boot spring-mvc
3个回答
1
投票

缩小 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,但这与资源处理程序无关,而是我们网关的问题。


0
投票
  1. 确保您的 SpringBoot 代码/控制器中没有配置默认路径“/”
  2. 确保您没有在应用程序中的任何位置使用 @EnableWebMvc 注释
  3. 将你所有的UI文件放在“../resources/public”文件夹中(主要是你的index.html应该在这个路径上)

这应该可以解决您的一般问题:)

SpringBoot 会自动检测到这一点,并且适用于各种单页应用程序。


0
投票

我按照你的回答但没有用。 URL /login 由 Spring Boot 的服务器处理。该服务器不会将 /login 转发到 index.html。你能解释一下你是如何让它发挥作用的吗?我想你需要有一种方法来告诉 Spring Boot 服务器进行转发。

© www.soinside.com 2019 - 2024. All rights reserved.