从Spring Boot转发到特定的Angular组件

时间:2019-03-17 07:24:19

标签: javascript java angular spring spring-boot

在我的Web应用程序中,Angular UI被用作Spring Boot应用程序中的静态资源(通过将内置的Angular应用程序复制到Spring Boot应用程序的 / resources / static 文件夹中)。

我所有的Spring端点都以/api为前缀。

来自Angular应用程序的相关路线:

{ path: 'login', component: LoginComponent },
{ path: 'registration', component: RegistrationComponent },
{ path: '', pathMatch: 'full', redirectTo: 'login' }

这很好,当我启动Spring Boot应用并在浏览器中导航到http://localhost:8080时,将显示Angular应用的登录页面。

有问题的部分:

通过将http://localhost:8080/loginhttp://localhost:8080/registration粘贴到浏览器并按Enter来直接导航到登录页面或注册页面将不起作用,因为该请求将命中Spring Boot应用程序并且由于没有匹配项映射,它将返回404。

我要做的第一件事显然是在Stackoverflow上寻找解决方案,大多数答案建议使用匹配的映射将请求转发到根,因此我添加了以下Controller

@Controller
public class ViewController {

    @RequestMapping({"/login", "/registration"})
    public String forward() {
        return "forward:/";
    }
}

这解决了404错误。

问题是即使我直接导航到http://localhost:8080/registration,我也被转到登录页面并显示LoginComponent

我想要实现的是当我在浏览器中导航到http://localhost:8080/registration,然后确实转到注册页面并显示Angular应用程序的RegistrationComponent

这甚至可能吗?如果是这样,我真的很乐意提供有关实现它的任何建议。

1 个答案:

答案 0 :(得分:1)

事实证明,我很愚蠢,这要感谢@JB Nizet的评论。

问题中发布的代码是正确的,但是我最近在Angular应用中将以下代码段添加到了我的AppComponent中(并对此有所遗忘):

this.authService.currentAuth
  .subscribe(auth => {
    if (!auth) { // navigate to login if the user is not authenticated
      this.router.navigate(['/login']);
    }
  });

这完全是错误的,这就是导致问题的原因。