Springboot 2.x中server.servlet.context-path的运用

今天在开发项目的时候遇到了请求不通API的问题,最开始以为是server.servlet.context-path配置导致的问题,最终发现是由于AWS端口未开放/监听导致的connection refuse。虽然如此,仍然想记录一下server.servlet.context-path的作用。

功能

这个配置能够设置项目中的所有API的上下文路径(URL的一部分),与@RequestMapping有异曲同工之妙。

我们知道,@RequestMapping能够在API方法层级声明,同时能够在Controller的类层级声明,为什么能够在多层级声明呢?大家很容易想到,为了使API url的语义性,遵从REST标准的API是非常棒的,同一个Controller下的URL前缀相同能够非常明确的表达语义与关联关系。

那么,如果我们有多个项目/微服务呢?也应该做到这一点,只不过是以更大的层级方式在应用。server.servlet.context-path能够以一个project为单位配置默认的URL上下文路径,保持设计的一致性是非常合适的做法。

用法

如果我们没有添加任何配置,则为默认值“/”,
我们可以在Springboot的properties下配置:

server.servlet.context-path=/api/demo

如果使用的是yml配置方式,则为:

server:
	servlet:
		context-path:/api/demo

那么我们调用一个地址本来为 [ip地址]:[端口号]/books 的API,现在变成了 [ip地址]:[端口号]/api/demo/books

注意!!! 配置上有一个小坑,如果你使用的是Springboot 1.x版本,我们需要改为使用 server.context-path 来配置路径。

优点

  1. 我们能够通过此配置在更大的层级上做统一的路径配置,体现了RESTFul的语义化API URL的优势。
  2. 便于配置Ngnix的请求分发
  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring Boot,可以通过配置`server.servlet.context-path`来设置应用程序的上下文路径(即context-path)。如果需要统一添加前缀,则可以使用Spring MVC的`HandlerInterceptor`来拦截请求,并在请求路径前添加前缀。 具体步骤如下: 1. 创建一个`HandlerInterceptor`实现类,实现`preHandle`方法,在该方法获取请求路径并添加前缀,然后将修改后的路径设置回请求。 ``` @Component public class PrefixInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String prefix = "/api"; // 前缀 String requestURI = request.getRequestURI(); // 请求路径 String newURI = prefix + requestURI; // 添加前缀 request.getRequestDispatcher(newURI).forward(request, response); // 设置修改后的路径 return true; } } ``` 2. 在Spring Boot配置类添加`InterceptorRegistry`,并将上面创建的`HandlerInterceptor`添加到其。 ``` @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private PrefixInterceptor prefixInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(prefixInterceptor).addPathPatterns("/**"); // 添加拦截器并设置拦截路径 } } ``` 3. 在`Controller`使用`@RequestMapping`注解指定接口路径,如`/user`,拦截器会自动添加前缀,最终的请求路径为`/api/user`。 ``` @RestController @RequestMapping("/user") public class UserController { @GetMapping("/list") public List<User> list() { // ... } // ... } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值