2017-04-04 44 views
0

我在2個EC2實例(分段和生產環境)上部署了Spring Boot應用程序。我有一個用於下載文件的端點。它看起來像這樣(的應用程序是用科特林):HTTP頭不在EC2上返回

@PostMapping("/download") 
open fun download(@RequestBody request: DownloadRequest, servletResponse: HttpServletResponse) { 
    val file = getByteArray(request.fileId) 
    servletResponse.outputStream.write(file) 
    servletResponse.contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE 
    servletResponse.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"${request.fileId}.zip\"") 
} 

當我執行上的臨時機一切的下載請求的罰款。我找回文件,並且響應已設置標題。這些是我在郵差看到標題:

Cache-Control →no-cache, no-store, max-age=0, must-revalidate 
Connection →keep-alive 
Content-Disposition →attachment; filename="345412.zip" 
Content-Length →11756 
Content-Type →application/octet-stream 
Date →Tue, 04 Apr 2017 09:04:19 GMT 
Expires →0 
Pragma →no-cache 
X-Application-Context →application:8081 
X-Content-Type-Options →nosniff 
X-Frame-Options →DENY 
X-XSS-Protection →1; mode=block 

當我這樣做對生產相同的請求,響應主體包含文件的內容,但2頭,我手動設置,「內容類型」和「Content-Disposition」丟失:

Cache-Control →no-cache, no-store, max-age=0, must-revalidate 
Connection →keep-alive 
Content-Length →56665 
Date →Tue, 04 Apr 2017 09:06:45 GMT 
Expires →0 
Pragma →no-cache 
X-Application-Context →application:8081 
X-Content-Type-Options →nosniff 
X-Frame-Options →DENY 
X-XSS-Protection →1; mode=block 

這兩臺機器都在Docker容器中部署了完全相同的JAR。這兩個調用都是使用它們的私有IP直接針對EC2實例完成的,因此不涉及ELB。這兩個實例的配置完全相同,我可以在AWS控制檯中找到不同的區別。

你知道是什麼原因造成的?在EC2中是否有一個設置可以防止某些HTTP頭被回送回來?我找不到任何理由說明爲什麼標題在一種情況下發回,而不是在另一種情況下發回。

+0

我想知道你的請求是否真的觸及'download'方法。執行調用您的prod主機時,您從服務器獲取的HTTP代碼是什麼? – Trein

+0

@Trein舞臺和製作的狀態碼都是200。我的請求如何不能到達'download'方法?我正在取回響應主體中的文件內容。 –

+0

你說得對。我錯過了你說響應主體帶有文件內容的部分。在兩種環境之一中是否有任何環境變量設置不同? Spring Boot有幾個內置的槓桿和開關,可能導致登臺/產品差異。 – Trein

回答

0

問題被固定通過先寫響應頭,然後響應正文:

@PostMapping("/download") 
open fun download(@RequestBody request: DownloadRequest, servletResponse: HttpServletResponse) { 
    val file = getByteArray(request.fileId) 
    servletResponse.contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE 
    servletResponse.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"${request.fileId}.zip\"") 
    servletResponse.outputStream.write(file) 
} 

如果你開始先寫體,標題可能無法正確設置。我仍然不確定爲什麼只在生產機器上進行復制。