我有一个 Java 8 Spring Boot 应用程序,其中 嵌入式 Web 服务器部署为 Azure 应用服务。该应用程序可在 Azure 应用服务的标准域 -
<myapp>.azurewebsites.net
下使用。我的应用程序将 HSTS (Strict-Transport-Security
) 标头添加到其 HTTP 响应中。我通过从应用服务 SSH 发出 curl
命令来验证这一点。从应用程序服务内的 SSH,我安装了curl,当我发出请求时,我可以看到我的 Strict-Transport-Security
标头以及我的应用程序返回的自定义 X-Custom-Header
:
> curl http://0.0.0.0/test/debug -v
< HTTP/1.1 200
< Strict-Transport-Security: max-age=31536000
< X-Custom-Header: custom-value
< ...other headers...
但是,当我尝试通过
<myapp>.azurewebsites.net
域执行相同操作时,Strict-Transport-Security
标头丢失:
> curl https://<myapp>.azurewebsites.net/test/debug -v
< HTTP/1.1 200
< X-Custom-Header: custom-value
< ...other headers visible but no Strict-Transport-Security...
通过公共
Strict-Transport-Security
域访问我的应用服务 API 时,如何向响应添加 <myapp>.azurewebsites.net
标头?
应用程序本身设置正确,正如我通过应用服务 SSH 发出
curl
命令所证明的那样,但当通过公共 <myapp>.azurewebsites.net
域访问应用程序时,标头会被删除。
这是我用来调试此问题的 JAX-RS 控制器,它始终添加
Strict-Transport-Security
标头和 X-Custom-Header
以用于调试目的:
import javax.ws.rs.*
import javax.ws.rs.core.MediaType
import javax.ws.rs.core.Response
@Path("/test")
class DebugResource {
@GET
@Path("/debug")
@Produces(MediaType.APPLICATION_JSON)
fun debug(): Response {
return Response.ok("test")
.header("Strict-Transport-Security", "max-age=31536000")
.header("X-Custom-Header", "custom-value")
.build()
}
}
当我尝试你的代码时,我遇到了同样的问题,这是因为 您正在使用 JAX-RS 注释而不是 Spring MVC 注释。Spring Boot 默认情况下无法识别 JAX-RS。
请参阅此 doc 以更好地了解 Spring MVC 注释。
我已将您的代码修改为以下内容,以正确检索标头。
调试资源.kt:
package com.example.demoweb
import jakarta.servlet.http.HttpServletResponse
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/test")
class DebugResource {
@GetMapping("/debug")
fun debug(response: HttpServletResponse): String {
response.addHeader("Strict-Transport-Security", "max-age=31536000")
response.addHeader("X-Custom-Header", "custom-value")
return "test"
}
}
本地输出:
部署后输出: