Springboot 如何为 API 添加统一路径前缀?

2019-12-21 11:23:25 +08:00
 handsomezai
Springboot 如何为 API 添加统一路径前缀,类似 /api/v2/**这种,不使用 server.servlet.context-path,这个是控制整个项目的,请大神献策
12585 次点击
所在节点    Java
17 条回复
arthas2234
2019-12-21 11:26:55 +08:00
nginx 反向代理?
xuwenping
2019-12-21 11:32:23 +08:00
不太明白 server.servlet.context-path 为什么不能解决你的问题。或者写个 basecontroller,其他所有的 controller 都继承它,basecontroller 用来实现你的同一路径前缀
w292614191
2019-12-21 11:32:50 +08:00
@RequestMapping("/api/user/getUser")

@RequestMapping("/api/menu/getMenu")
@RequestMapping("/api/menu/delMenu")

@RequestMapping("/api/v2/getList")
zwh2333
2019-12-21 11:34:50 +08:00
好像用 Spring Cloud Gateway 可以
qinxi
2019-12-21 11:37:05 +08:00
server.context-path:
cedoo22
2019-12-21 11:38:20 +08:00
nginx ?
spring zuul?
拦截器 / 过滤器??
handsomezai
2019-12-21 11:42:03 +08:00
主要是项目的后台管理端 layui 写的使用 nginx 部署。初期是前端后台的接口全部写在同一个 springboot 项目中了,现在想把前端的接口全部抽出来单写一个项目里面加入统计和各种日志以应对 SEM 的各种需求变更,至于后台想把 layui 集成到项目中去,这样后期可以做 IP 白名单进行限定 IP 登录,但是后台中的接口能不能再加个统一的前缀,全部手动改几百个接口都要去改动
handsomezai
2019-12-21 11:44:58 +08:00
@arthas2234 nginx 线上在使用,现在要根据 IP 白名单控制后台页面的输出,所以使用 springboot 本身进行 IP 动态管控
handsomezai
2019-12-21 11:47:56 +08:00
@xuwenping server.servlet.context-path 是整个项目的路径,因为现在将后台管理页面加入进去(之前分离的单独部署,nginx 反向代理),第二种继承 baseController 对整个项目改动太多
devld
2019-12-21 11:51:39 +08:00
实现 WebMvcConfigurer 接口

```java
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.addPathPrefix("/api", c -> c.isAnnotationPresent(ApiController.class));
}
```
luozic
2019-12-21 11:52:42 +08:00
nginx 可以玩 ip 白名单模式。
luozic
2019-12-21 11:53:16 +08:00
“现在要根据 IP 白名单控制后台页面的输出“ 这个才是真的需求。
handsomezai
2019-12-21 11:57:08 +08:00
@devld 大哥,正解,非常感谢!!!
handsomezai
2019-12-21 12:01:18 +08:00
感谢大家的回答,devld 的更符合我现在的需求,我这边也查到了一个,分享一下,
//自动注入 spring boot 默认的上传配置
@Autowired
private MultipartConfigElement multipartConfigElement;
@Autowired
private DispatcherServlet dispatcherServlet;

@Bean
public ServletRegistrationBean apiServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(dispatcherServlet);
//注入上传配置到自己注册的 ServletRegistrationBean
bean.addUrlMappings("/api/*");
bean.setMultipartConfig(multipartConfigElement);
bean.setName("apiServlet");
return bean;
}
不过还是推荐使用 devld 用户的,实现 WebMvcConfigurer 接口的 configurePathMatch 接口
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.addPathPrefix("/api", c -> c.isAnnotationPresent(RestController.class) || c.isAnnotationPresent(Controller.class));
}
RestController 是接口的,Controller 里面包含的是验证码输出一类的视图
handsomezai
2019-12-21 12:06:13 +08:00
@luozic nginx 做 IP 白名单,动态的有点麻烦,不如直接使用项目中拦截控制,存到数据库,使用 redis 做缓存加速,因为这个后台是面向公司内部人员使用的最多 200 员工,三五年内用户变化可能小,所以后台并发性能这块不用特别注重。前端的接口我准备单独提出来,着重性能去做优化
handsomezai
2019-12-21 13:43:36 +08:00
@cedoo22 zuul 用不到,公司项目小,没必要整那么多服务^__^
Vanes
2020-03-02 15:24:03 +08:00
@handsomezai 你这种方式的话,是不是带不带 /api 这个前缀都能访问到对应的接口哦?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/631009

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX