为SPA前端配置Spring Boot

Rud*_*koŭ 3 java spring angularjs single-page-application gulp

我有整个前端部分在资源中铺设的应用程序.我想将事情分开.并且具有用于UI的单独服务器,例如由gulp提供.

因此,我假设我的服务器应该返回index.html客户端呈现的所有请求.

例如:我有'user /:id'路由,它通过角度路由进行管理,不需要任何服务器.如何配置以便服务器不会重新加载或重定向到任何地方?

我的安全配置正在跟随(不知道它是否负责此类事情):

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);
    } 
Run Code Online (Sandbox Code Playgroud)

Epi*_*rce 14

对于路由,根据本指南Using "Natural" Routes(特别是此处),您必须添加执行以下操作的控制器:

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

然后使用Spring Boot,可以index.html加载at /和资源; 路由由Angular处理.

  • 但这不包括带有另一个正斜杠的 URL。EG 本地主机:8080/im-covered 和本地主机:8080/im/not/covered (3认同)
  • @EpicPandaForce`{[path:[^ \\.]*}`究竟是什么意思?它从何而来?我理解正则表达式,我不明白Spring Boot如何处理"路径"部分. (2认同)
  • 这是[特殊语法](https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-requestmapping-uri-templates)[命名路径变量] (/sf/answers/1436924961/)。`path:` 表示该正则表达式匹配的 URL 部分将绑定到具有相应名称的 `@PathVariable` 。 (2认同)

小智 5

EpicPandaForce 有一个很好的答案,我想扩展它。以下端点也将允许匹配嵌套路由。如果您想要一个管理部分,您可以将其配置为返回不同的 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"
    }
}
Run Code Online (Sandbox Code Playgroud)

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