使用 Thymeleaf 显示当前服务网关 url

Posted

技术标签:

【中文标题】使用 Thymeleaf 显示当前服务网关 url【英文标题】:Display current service gateway url by using Thymeleaf 【发布时间】:2017-11-16 07:43:34 【问题描述】:

我无法找到一种解决方案来显示我当前的服务 url(在 eureka 注册并通过 zuul 网关调用),例如:http://localhost:8080/services/someservice 在客户端 html 页面中使用 Thymeleaf。

我尝试过使用#httpServletRequest?.requestURL,但这会返回服务在 Eureka 中的注册方式,例如:user.somepackage.com:someservice:8011,这并不是我想要的。

对此我有一个可能的解决方案是在 Thymeleaf 中使用硬编码的 url 分配一个变量,或者通过 Spring 控制器执行此操作,但我认为这不是一个简洁的方法。

也许有人遇到了类似的问题并找到了更好的解决方案。

【问题讨论】:

【参考方案1】:

其实解决方法很简单:

<a th:href="@~/services/someservice/logout">

最有趣的部分是 ~ 标志。这定义了实际的服务器 url,例如:http://localhost:8080。正是我需要的。

【讨论】:

【参考方案2】:

启用 Reverse 代理后,使用配置的路由映射应该很简单。

考虑以下 ZUUL API 网关的路由映射示例:

zuul:
  routes:
    someservice:
      path: /services/someservice/**
      url: http://localhost:8080/services/someservice

您应该能够在客户端 Thymeleaf 模板中访问您的服务的 context-relative URL:

<a th:href="@/services/someservice/">
<!-- OR -->
<form th:action="@/services/someservice">
<!-- ... -->

根据您的需要,您应该使用适当的Thymeleaf URL syntax。下面是 URL 示例:

<!-- Server-relative -->
<a th:href="@~/services/someservice/">

<!-- Context-relative -->
<a th:href="@/services/someservice/">
<!-- ... -->

【讨论】:

感谢您的解决方案,但恐怕它并不能完全解决问题,我有:我的 url 在应用程序中并且附加的 .js 或 .css 文件在我浏览时丢失了围绕我的申请,fe转到services/someservice/findsomething/id. 我必须将整个网址静态插入href 才能使它们工作。如果没有整个 url,使用 th:href 也不起作用。这就是为什么我正在考虑使用一些参数来查找当前的 url,并且如我上面提到的那样返回。 我刚刚提到了上下文相关的 URL 方案。我猜你需要一个服务器敏感的 URL 路径。我会相应地更新答案。

以上是关于使用 Thymeleaf 显示当前服务网关 url的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC:如何在 Thymeleaf 中获取当前 url

获取包含所有参数的完整当前 url thymeleaf

如何使用 Spring Boot Thymeleaf 显示当前登录的用户?

thymeleaf使用小记

为微服务 API 网关配置 Nginx

Thymeleaf 获取当前登录的用户名作为字符串