【问题标题】:spring HATEOAS links issue for HTTP and HTTPS春季 HATEOAS 链接 HTTP 和 HTTPS 的问题
【发布时间】:2015-11-26 15:53:52
【问题描述】:

我在我的网络应用程序中使用Spring HATEOAS。我的应用程序在Nginx 网络服务器后面运行。我正在发送带有 HTTPS 标头的以下网址

获取https://national.usa.com/testapp-rest/api/user/654rtrtet-5grt-fgsdf-dfgs-765ytrtsdhshfgsh/newAuthentication

Status Code:200 OK
Response Headersview sourceAccess-Control-Allow-Headers:x-requested-with, Accept, Content-Type, Origin, Authorization, X-Auth-Token
Access-Control-Allow-Methods:POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin:*
Access-Control-Expose-Headers:X-Auth-Token
Access-Control-Max-Age:3600
Cache-Control:no-cache, no-store, must-revalidate
Connection:keep-aliveContent-Type:application/json
Pragma:No-cacheServer:XXX/1.6.0
Strict-Transport-Security:max-age=31536000
Transfer-Encoding:chunkedRequest Headers
view sourceAccept:application/json, text/plain, */*Accept-Encoding:gzip, deflate, sdch

但是当我看到响应标头时,我看到 HATEOAS 链接只返回 HTTP。如何解决这个问题?请指导。

"links: [{rel: "self",…}]0: {rel: "self",…}href: "http://national.usa.com
/testapp-rest/api/user/5435fdsg-45gfdgag-rewtdf43434-43543fsd "rel

编辑:是的,我使用以下代码创建链接

resource.add(ControllerLinkBuilder.linkTo(ControllerLinkBuilder.methodOn(TestController.class).getStudentResponse(response.getStudentId())).withSelfRel());

【问题讨论】:

  • 您发布的是演示网址吗?我收到 404。您是否在 Apache Httpd 或 Nginx 等网络服务器后面运行您的应用程序?

标签: nginx hateoas spring-hateoas


【解决方案1】:

正如您在 cmets 中提到的,您的应用程序在网络服务器后面运行。在这种情况下是 Nginx。

你正在使用某种类型的

linkTo(methodOn(MyController.class).myMethod(name)).withSelfRel());

生成链接。在这种情况下,请查看ControllerLinkBuilder。正如您在第 190 行中看到的那样,Spring HATEOAS 基于当前请求构建了一个链接。 此外,请求头 X-Forwarded-ProtoX-Forwarded-HostX-Forwarded-Ssl 会被查询并在可用时使用。

这是您为了与 Spring HATEOAS 建立正确链接而错过的配置。

因为您抱怨链接中只缺少https,Nginx 已经设置了X-Forwarded-For,但跳过了X-Forwarded-Proto。我假设 Nginx 和您的应用程序通过http 进行通信,否则您不会有麻烦。 你可以忽略X-Forwarded-Ssl。仅当 Nginx 和您的应用程序通过 https 交谈时才有意义。在这种情况下,您也不会看到任何问题。

您可以在下面找到完整的 Nginx location 块以供参考。 X-Forwarded-Proto 已设置为 https,以便通知代理系统链接必须在任何 URL 中包含 https(仅当后端系统处理上述请求标头时)。

location /yourapp {
    proxy_pass http://localhost:8080/yourapp;
    proxy_redirect default;
    proxy_set_header  Host               $http_host;
    proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto  https;
}

如需进一步阅读,请参阅 http_proxy_module 的 Nginx 文档。

【讨论】:

  • NGINX 菜鸟在这里:为什么不proxy_set_header X-Forwarded-Host $http_host;
猜你喜欢
  • 2023-03-27
  • 2019-03-23
  • 2016-02-27
  • 2016-09-07
  • 2015-07-25
  • 2011-10-19
  • 2016-06-29
  • 2016-12-14
  • 1970-01-01
相关资源
最近更新 更多