前面我们记录过vue router使用history模式时,项目打包扔在tomcat里时,tomcat该怎么配置来支持。这次vue项目打包后,js、css等静态资源发布在CDN上,将模版页index.html放在springboot后端项目里,再访问后端提供的url来转到index.html,那么该怎么配置呢?
如上所述,这次静态资源发布在CDN,给后端项目一个模版页,模版页中引用静态资源,通过时间戳来更新获取最新版本。springboot模版引擎用的thymeleaf,这是模版页:
1 |
|
springboot提供一个controller接口来访问转到模版页:
1 |
|
这里的f2eCdnUrl
是读取application.properties
配的cdn的url,我这里对外是从/view/
来访问index页面,而不是直接的/
,因为如果我项目里有结合SpringSecurity,需要对/api/**
的接口进行鉴权拦截,为了做区分,前端页面统一以/view
开头,同样的,在vue router的配置里也需要指明base
,如下
1 | let router = new VueRouter({ |
这个时候,启动springboot项目,可以通过/view/来访问前端项目的首页,并通过前端路由来跳转页面,但一旦刷新页面或者手动输入URL回车就会出现404页面。其实和在tomcat配置的原理类似,我们需要做的是对404做处理,当出现404的时候,再往一个URL上跳。
我们看一下org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer
这个接口:
1 | /** |
可以看到,这个接口是实现了策略模式的,重点是我们使用这个接口去设置error pages
,所以我们定义一个配置类,在配置类创建一个EmbeddedServletContainerCustomizer
这个接口的bean:
1 |
|
可以看到,定义了一个error page,http status是not found的时候,重新跳转回之前设置的/view/
这个路径。至此,就实现了springboot对vue router history模式的支持。