当前位置: 首页 > 知识库问答 >
问题:

Spring Boot执行器页面返回http链接而不是https

秦权
2023-03-14

我有一个Spring启动 2.0.2 应用程序。当我浏览到以下 URL 时:https://my-domain-name/my-application-name/actuator,我得到以下输出:

{
    "_links": {
        "self": {
            "href": "http://my-domain-name/my-application-name/actuator",
            "templated": false
        },
        "health": {
            "href": "http://my-domain-name/my-application-name/actuator/health",
            "templated": false
        },
        "info": {
            "href": "http://my-domain-name/my-application-name/actuator/info",
            "templated": false
        }
    }
}

如您所见,内容正常,但所有链接都以“http”开头,而不是https。然而,我使用HTTPS访问URL。

我尝试访问的域名是 AWS Route 53 记录,其中包含 AWS ELB 的别名。此 ELB 将调用重定向到 K8S 集群的目标。容器本身正在运行Nginx,它将URL重定向到另一个运行带有嵌入式Tomcat的Spring启动的容器,并使用HTTP和端口8080提供其内容。

对于Nginx,有一个代理传递配置:

location /my-application-name { proxy_pass http://my-application-name; }

正在添加以下标头:

proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;

…以便Spring Boot知道“原始”请求。

有人知道我做错了什么吗?执行器的实现似乎没有考虑HTTPS协议

共有1个答案

万俟鸿波
2023-03-14

我通过在配置类中添加以下代码块解决了这个问题:

@Bean
public FilterRegistrationBean forwardedHeaderFilterRegistration() {
    ForwardedHeaderFilter filter = new ForwardedHeaderFilter();
    FilterRegistrationBean<ForwardedHeaderFilter> registration = new FilterRegistrationBean<>(filter);
    registration.setName("forwardedHeaderFilter");
    registration.setOrder(10000);
    return registration;
}

看来< code > ForwardedHeaderFilter 确实考虑了< code>X-Forwarded-Proto标头。尽管还不清楚为什么默认情况下执行器实现不这样做(因为其他< code>X-Forwarded头被正确处理)

 类似资料:
  • 我正在将一个旧的java Spring项目重构为springboot,并以传统的war风格部署它。出于某种原因,我必须坚持传统的web.xml来启动应用程序。多亏了Springboot遗产,我可以通过web.xml实现这一点: 此外,我添加了springboot执行器依赖项。应用程序。属性如下所示: 应用程序可以正常启动,但当我尝试从浏览器访问endpoint时,它只返回一个“401需要完全身份验

  • 我写了自己的类加载器,它与类一起工作,实现了接口插件。但是我不能将类转换为插件。怎么了? 错误:(18,47)java:不兼容的类型:java。lang.类无法转换为插件 我补充说,这是我的SimpleClassLoader类的主要部分,它扩展了ClassLoader。

  • 我在库中公开了一个方法,该方法返回一个CompletableFuture。该方法的计算发生在单线程执行器上,这是我的瓶颈,因此我不希望任何后续工作发生在同一个线程上 如果我使用返回“SupplySync”结果的简单方法,我将向调用者公开我宝贵的线程,调用者可能会添加同步操作(例如通过Accept),这可能会在该线程上花费一些CPU时间 复制如下: 这确实打印出: 我发现的一个解决方案是引入另一个执

  • 我正在查询URI以从web服务获取一些数据。那很好。但我注意到,我的json hase多页的page\u计数,但只返回第一页数据。 以下是json的样子: 如何返回所有页面而不是只返回第一页?我知道这可能不是个好主意,但我该怎么做? 更新:web服务的URI类似于: 谢谢

  • 在Spring Boot Admin(SBA)Server上注册后,客户端的一些执行器使用而不是。为什么它将endpoint更改为HTTP,而不留在HTTPS?它是可定制的吗? 这里有一些日志和Java /YML-Files. 日志: 应用yml(服务器): SpringBootAdmin应用程序。java(服务器): 应用yml(客户):

  • 我有一个名为Backend(端口:9090)的服务,位于Zuul(端口:8080)后面。 浏览器在Zuul上调用GET方法,执行重定向。 示例调用:http://localhost:8080/testredirect 结果: 浏览器收到Http状态=200 浏览器URL:http://localhost:8080/testredirect 浏览器显示:Hello world 预期结果: 浏览器应接