【问题标题】:How to convert a subdomain to a path Spring boot如何将子域转换为路径 Spring boot
【发布时间】:2021-08-10 23:38:15
【问题描述】:

如何配置应用程序以使每个客户端都有其上下文?

例子:

  1. 主要
  • client1.domain.com --> domain.com/client1
  • client2.domain.com --> domain.com/client2
  • ....
  1. 登录
  • client1.domain.com/Login --> domain.com/client1/Login
  • client2.domain.com/Login --> domain.com/client2/Login
  • ....

我目前的应用使用子域的配置是因为springboot本身识别它是在不同的上下文中,但是通过路径看不懂怎么做

【问题讨论】:

  • 不确定您是否正在寻找应该返回客户端 1 数据的 domain.com/client/1 之类的路径。您可以查看此链接:baeldung.com/spring-boot-start 并搜索以下方法:@GetMapping("/{id}") public Book findOne(@PathVariable Long id) { return bookRepository.findById(id) .orElseThrow(BookNotFoundException::new) ; }
  • @Rakmo 感谢您的回复,我实际上需要应用程序根据 uri 的第一个子目录为每个租户提供一个独立的上下文。例如:mydomain.com/tenant1/* mydomain.com/tenant2/* 其中 * 将是所有消费 url
  • 这不是开箱即用的。如果每个客户端的 URL 结构都相同,则可以使用自定义参数解析器做一些巧妙的事情。
  • 有什么理由不能在 DNS 记录中执行此操作?或者使用 LoadBalancer 路由到服务器上的正确端点?
  • @YashDigantJoshi 感谢您的回答。目前系统开发的和你描述的完全一样,但是这种修改思路有降低成本的原则

标签: java spring-boot spring-security


【解决方案1】:

您始终可以使用注释从请求中获取主机名:

  @GetMapping(path = "/secret")
  @ResponseBody public String getSecret(@RequestHeader("Host") String host ) {
    var client = getClientFromHost(host);
    // ...
  }

如果此服务前面有负载均衡器,则可以使用X-Forwarded-From 标头代替Host 标头。

然后您可以简单地解析主机 URL,以提取标识您的客户端的子域。

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 2016-04-28
    • 2019-03-25
    • 2019-12-16
    • 2018-04-04
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2019-08-18
    相关资源
    最近更新 更多