java - 前端与后端端点(spring boot 和 vuejs)
问题描述
有点基于本指南:
我创建了一个多模块 maven 项目,其中一个子模块是我的后端,另一个子模块是我的前端。当我首先构建整个项目时,前端是“构建”,然后它的dist/
资源被复制到后端,然后构建,我可以成功地启动我的 spring boot 后端java -jar target/backend-1.0.0-SNAPSHOT
并访问它localhost:8080
根据我在后端实现的控制器,这是有道理的:
@RestController
public class GreetingController {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
return new Greeting(counter.incrementAndGet(), String.format(template, name));
}
@RequestMapping("/")
public Greeting root(@RequestParam(value = "name", defaultValue = "Root!") String name) {
return new Greeting(counter.incrementAndGet(), String.format(template, name));
}
}
如果我改为访问:http://localhost:8080/index.html
我最终在我的前端:
其中目前有以下两条路线:
路由器.js
Vue.use(Router);
const router = new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path: '/',
name: 'home',
component: HomeRoute
},
{
path: '/myroute',
name: 'myroute',
component: MyRoute
}
]
});
export default router;
在例如App.vue我有:
<template>
<div class="hello">
<li>
<router-link to="/MyRoute">GoToMyRoute</router-link>
</li>
<li>
<router-link to="/">GoToHome</router-link>
</li>
<router-view></router-view>
</div>
</template>
我也可以访问,例如:
到目前为止,一切都很好。但是,如果我尝试http://localhost:8080/MyRoute
直接在我的浏览器中输入:我会得到:
我认为这是因为我的控制器中缺少@RequestMapping
后端/MyRoute
。
基于以上,我的问题变成:
- 如果我希望能够直接在浏览器中访问它,是否需要为我拥有的每个 vuejs 路由维护一个后端 RequestMapping?
- 如何分离/订购我的前端和后端端点?现在,与纯前端端点/路由相比,访问后端端点的时间似乎没有约定。
解决方案
我尝试使用以下代码(受 Gus 回答的启发):
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@RestController
public class RouterCtrl {
@RequestMapping("/**/{path:[^.]*}")
public ModelAndView redirect() {
return new ModelAndView("forward:/");
}
}
并考虑:
您的后端端点必须以前缀
api/
(或其他一些独特的词)开头处理Router Vue找不到的404,如下所示:
Vue.use(Router); const router = new Router({ mode: 'history', base: process.env.BASE_URL, routes: [ { path: '/', name: 'home', component: HomeRoute }, { path: '/myroute', name: 'myroute', component: MyRoute }, { path: '/:catchAll(.*)', name: 'notFound', component: NotFound } ] }); export default router;
我做了一个简单的gif 来说明:9
推荐阅读
- javascript - 在字符串数组javascript中设置参数键
- python - uMongo 从集合中获取随机文档
- java - 是否可以将 JVM 选项存储在文件中?
- javascript - SwaggerUIBundle 隐藏方案
- python - Python中的静态方法和类方法是否每个类只定义一次?
- eclipse - 可以 IDEA 使用最新的类文件解析 eclipse 和 auto 等 maven 子模块
- python - 如何生成带有跳过的列表的顺序子列表
- javascript - 我如何接收和传递“v-”道具给孩子们?
- azure-active-directory - 更改 Azure AD 密码策略
- reactjs - 使用 useIntl 模拟 react-intl