当前位置: 首页 > web >正文

java servlet: context-path的作用

当 没有配置 java servlet:    context-path 时, swagger的地址是 

http://localhost:8086/api/v1/swagger-ui/index.html 

当配置了 java servlet:    context-path 时, swagger的地址前要加上context-path 

比如 application.yml是 

server:port: 8086servlet:context-path: /api/v1/spring:datasource:url: jdbc:mysql://localhost:3306/user_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 5min-idle: 5max-active: 20test-while-idle: truetest-on-borrow: falsetest-on-return: falsemybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: trueglobal-config:db-config:id-type: autologic-delete-field: deletedlogic-delete-value: 1logic-not-delete-value: 0springdoc:swagger-ui:path: /swagger-ui.htmltags-sorter: alphaoperations-sorter: alpha

context-path 的作用(Spring Boot 中的 server.servlet.context-path)​

context-path(上下文路径)是 Web 应用的基础路径,用于区分不同的应用或模块。在 Spring Boot 中,可以通过 server.servlet.context-path 配置项来设置。


​1. 主要作用​

​(1) 提供应用隔离​

  • 如果同一个 Tomcat 服务器部署多个应用,可以通过不同的 context-path 区分它们。
    ​示例​​:
    • http://localhost:8080/app1/ → 应用1
    • http://localhost:8080/app2/ → 应用2

​(2) 统一 API 前缀​

  • 所有 API 自动加上 context-path 前缀,避免手动在每个 @RequestMapping 中重复写路径。
    ​示例​​:
     

    yaml

    复制

     

    server: servlet: context-path: /api

    • 访问 /api/users 而不是 /users

​(3) 适配代理服务器(Nginx/Apache)​

  • 反向代理(如 Nginx)可以通过 context-path 将请求转发到不同的微服务。
    ​示例​​:
     

    复制

     

    location /api/ { proxy_pass http://localhost:8080/api/; }


​2. 配置方式​

​(1) application.properties / application.yml

 

yaml

复制

 

server: servlet: context-path: /api # 所有请求需加 /api 前缀

​生效后​​:

  • http://localhost:8080/api/test → 实际访问 /test 接口

​(2) 代码方式(不推荐)​

 

java

复制

 

@SpringBootApplication public class MyApp { public static void main(String[] args) { SpringApplication app = new SpringApplication(MyApp.class); app.setDefaultProperties(Collections.singletonMap("server.servlet.context-path", "/api")); app.run(args); } }


​3. 影响范围​

  • ​所有请求​​(包括静态资源、API、WebSocket)都会自动加上 context-path 前缀。
    ​示例​​:

    • 静态资源:/api/index.html(原路径 /static/index.html
    • API 接口:/api/users(原路径 /users
    • WebSocket:/api/ws(原路径 /ws
  • ​特殊情况​​:

    • @RequestMapping 已经包含 /api,则最终路径会是 /api/api/xxx(需注意避免重复)。

​4. 常见问题​

​(1) 静态资源 404​

如果配置了 context-path,访问静态资源时也要加上前缀:

 

复制

 

http://localhost:8080/api/css/style.css

​解决方案​​:

  • 确保静态资源放在 src/main/resources/static/ 下
  • 前端代码引用资源时使用相对路径或动态拼接 context-path

​(2) Swagger/Actuator 路径变化​

  • ​Swagger UI​​:http://localhost:8080/api/swagger-ui.html
  • ​Actuator​​:http://localhost:8080/api/actuator/health

​(3) 测试时路径错误​

在单元测试中,MockMvc 需要手动处理 context-path

 

java

复制

 

@SpringBootTest @AutoConfigureMockMvc class MyControllerTest { @Autowired private MockMvc mockMvc; @Test void testApi() throws Exception { mockMvc.perform(get("/api/test")) // 必须带上 /api .andExpect(status().isOk()); } }


​5. 最佳实践​

  1. ​微服务推荐使用 /api 作为默认前缀​​,避免直接暴露根路径。
  2. ​前端代码动态获取 context-path​(避免硬编码):
     

    javascript

    复制

     

    const API_BASE = window.location.pathname.split('/')[1] || ''; fetch(`/${API_BASE}/users`);

  3. ​结合 @RequestMapping 使用​​:
     

    java

    复制

     

    @RestController @RequestMapping("/v1") // 最终路径: /api/v1/users public class UserController { @GetMapping("/users") public List<User> getUsers() { ... } }


​总结​

场景说明
​多应用隔离​不同应用使用不同 context-path
​统一 API 前缀​避免手动写 /api 前缀
​反向代理适配​Nginx/Apache 根据路径转发请求
​静态资源访问​需加上 context-path

配置 context-path 后,所有请求都必须带上该前缀,否则会返回 ​​404​​。

http://www.xdnf.cn/news/10521.html

相关文章:

  • powershell7.5@.net环境@pwsh7.5在部分windows10系统下的运行问题
  • Java实现中文姓名转拼音生成用户信息并写入文件
  • Lighttpd CGI配置:404错误排查实录
  • Python 中的继承机制:从基础到高级应用
  • SRE 基础知识:在站点可靠性工程中可以期待什么
  • Bootstrap 5学习教程,从入门到精通,Bootstrap 5 入门简介(1)
  • 【js逆向_AES】全国二手房指数数据爬取
  • 《关于有序推动绿电直连发展有关事项的通知》核心内容
  • Flannel MAC地址冲突导致Pod 跨节点通信异常
  • 6.运算放大器—增益带宽积(六)
  • __STDC_VERSION__
  • 路由策略与路由控制
  • Linux系统配置网络优先级
  • Wavelib 库的核心属性、方法
  • Sa-Token 同端登录冲突检测实战
  • 箱式不确定集
  • Baklib加速企业AI数据治理实践
  • AtCoder Beginner Contest 399题目翻译
  • 前端面经 响应式布局
  • 2023ICPC杭州题解
  • 文档核心结构优化(程序C++...)
  • TensorFlow深度学习实战(19)——受限玻尔兹曼机
  • seq2seq 视频截图
  • 深度学习篇---人脸识别中的face-recognition库和深度学习
  • 【Canvas与色彩】八彩大风车
  • springboot-响应接收与ioc容器控制反转、Di依赖注入
  • nt!MiDispatchFault函数里面的nt!IoPageRead函数分析和nt!MiWaitForInPageComplete函数分析
  • URLDNS利用链剖析
  • latex figure Missing number, treated as zero. <to be read again>
  • mybatis01