为 SPA 前端配置 Spring 引导

Configure Spring Boot for SPA frontend

我有一个应用程序,整个前端部分都放在资源中。我想把事情分开。并为 UI 提供单独的服务器,例如,由 gulp 提供。

所以我假设我的服务器应该 return index.html 对于客户端呈现的所有请求。

例如:我有 'user/:id' 路由,由 angular 路由管理,不需要服务器。如何配置以使服务器不会重新加载或将我重定向到任何地方?

我的安全配置如下(不知道它是否负责这些事情):

public class Application extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**").authorizeRequests().antMatchers("/", "/login**", "/webjars/**", "/app/**", "/app.js")
                .permitAll().anyRequest().authenticated().and().exceptionHandling()
                .authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/")).and().logout()
                .logoutSuccessUrl("/").permitAll().and().csrf()
                .csrfTokenRepository(csrfTokenRepository()).and()
                .addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
                .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
    } 

对于路由,根据 this guide at Using "Natural" Routes (specifically here),您必须添加一个执行以下操作的控制器:

@Controller
public class RouteController {
    @RequestMapping(value = "/{path:[^\.]*}")
    public String redirect() {
        return "forward:/";
    }
}

然后使用Spring启动,index.html加载到/,可以加载资源;路由由 Angular.

处理

如果您将 Angular 与 Spring Data Rest 一起使用,我认为最直接的方法是使用 angular 哈希位置策略。

只需将其放入您的应用模块的提供者数组中即可:

{ provide: LocationStrategy, useClass: HashLocationStrategy }

并且,显然,导入它。

EpicPandaForce 有一个很好的答案,我想对其进行扩展。以下端点也将允许在嵌套路由上进行匹配。如果您想要一个管理部分,您可以将其配置为 return 不同的 index.html。

@Controller
class PageController {

    @GetMapping("/**/{path:[^\.]*}")
    fun forward(request: HttpServletRequest): String? {
        if(request.requestURI.startsWith("/admin")) {
            return "forward:/admin/index.html"
        }
        return "forward:/index.html"
    }
}

此 RequestMapping(或@GetMapping)通过排除任何包含句点(即 "index.html")的请求来工作。