从 Spring Web MVC 应用程序中排除 Angluar2 路由

Posted

技术标签:

【中文标题】从 Spring Web MVC 应用程序中排除 Angluar2 路由【英文标题】:Exclude Angluar2 route from Spring Web MVC application 【发布时间】:2016-11-23 11:57:44 【问题描述】:

我有一个设置了一些视图的 spring-boot 应用程序。我还捆绑了一个 Angular2 应用程序。当我加载 Angular2 应用程序时,一切正常,但是,当我尝试深度链接到应用程序中的路由时,Spring MVC 正在拦截调用,未能找到关联的视图并返回错误页面。

http://localhost:8080/index.html 将加载 Angular2 应用程序,然后将 URL 重写为 http://localhost:8080/。如果我然后导航到我想要的路线,例如http://localhost:8080/invite/12345,然后路由加载并按预期工作。点击http://localhost:8080/invite/12345直接返回标准的Spring MVC错误页面。

但是,如果我将 Angular2 应用程序作为独立应用程序运行(不是由 spring-boot 提供的),那么直接点击该链接可以按预期工作。它加载 index.html,触发路由并向我显示我想要的数据。

我如何通过 Java 配置告诉 Spring 忽略 /invite/** 路径(以及随着我的 Angular2 应用程序增长的其他路径),以便我可以深度链接到我的 Angular2 应用程序中的路由。这是当前的 Java 配置:

@SpringBootApplication
@EnableResourceServer
public class AuthserverApplication extends WebMvcAutoConfigurationAdapter 

    public static void main(String[] args) 
        SpringApplication.run(AuthserverApplication.class, args);
    

    @Override
    public void addViewControllers(ViewControllerRegistry registry) 
        registry.addViewController("/login").setViewName("login");
        registry.addViewController("/oauth/confirm_access").setViewName("authorize");
        registry.addViewController("/success").setViewName("success");
    

    @Bean
    public ViewResolver getViewResolver() 
        final InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setSuffix(".html");
        return resolver;
    

此项目继承自 spring-boot 1.3.3.RELEASE:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.3.RELEASE</version>
</parent>

【问题讨论】:

忽略是什么意思?那它会返回什么?让所有链接返回相同的结果(页面)怎么样? @acdcjunior - 我配置了许多仍然需要工作的 Spring Web MVC 视图,但是当我点击 /invite/** 路径时,该路径实际上是由捆绑的 Angular 2 应用程序控制的我希望 Spring MVC 不处理该路径。 假设 Angular2 应用程序的根位于 /invite/。如果是这种情况,那么对该 URL 的请求会返回一个包含 angular2 应用程序的视图,您同意吗?如果是这种情况,只需向/invite/** 发出任何请求,指向同一个视图(无需重写 URL,因此 Angular 知道它的确切位置)。你怎么看? 【参考方案1】:

根据您的回答,我这样配置并且有效。

@RequestMapping(value = "/*", method = RequestMethod.GET)
@Override
public String index()

    return "index";


@Override
@RequestMapping(value = "/login/*", method = RequestMethod.GET)
public String login()

    return "redirect:/#/login";

所以我们可以访问 localhost:8080/angular-app/login/ 而不会出现 404 错误。

【讨论】:

【参考方案2】:

所以我最终解决这个问题的方法是直接链接到 index.html 页面,以便它强制加载 angular2 应用程序,例如:

http://localhost:8080/index.html/#/invite/12345

【讨论】:

以上是关于从 Spring Web MVC 应用程序中排除 Angluar2 路由的主要内容,如果未能解决你的问题,请参考以下文章

Spring中Web应用程序的MVC结构?

spring拦截器排除 静态资源

从Spring MVC 到 Spring BOOT的简化道路

Spring MVC 从 2.5 到 3.0

Spring MVC 实践 - Base

如何从视图中排除 js 文件-asp.net mvc