为 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")的请求来工作。
我有一个应用程序,整个前端部分都放在资源中。我想把事情分开。并为 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")的请求来工作。