2017-04-04 1 views
0

2 개의 EC2 인스턴스 (준비 및 프로덕션 환경)에 스프링 부트 응용 프로그램이 배포되었습니다. 파일을 다운로드하는 데 사용되는 끝점이 있습니다. 그것은 (응용 프로그램이 코 틀린로 작성) 다음과 같습니다EC2에서 HTTP 헤더가 반환되지 않음

@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-Type을"및 "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가 관련되지 않습니다. 2 개의 인스턴스 구성이 동일하며 AWS Console에서 차이점이 없습니다.

이 문제의 원인은 무엇입니까? EC2에서 일부 HTTP 헤더가 응답으로 다시 전송되는 것을 막을 수있는 설정이 있습니까? 한 경우에는 헤더가 전송되고 다른 헤더에는 헤더가 전송되지 않는 이유는 찾을 수 없습니다.

+0

귀하의 요청이 실제로'download' 메소드를 치고 있는지 궁금합니다. 찌르는 호스트를 호출 할 때 서버에서 가져온 HTTP 코드는 무엇입니까? – Trein

+0

@Trein 상태 코드는 스테이징 및 프로덕션 모두에 대해 200입니다. 어떻게 내 요청이'download' 메소드에 도달하지 못했을까요? 응답 본문에서 파일 내용을 다시 가져옵니다. –

+0

당신 말이 맞아요. 응답 본문에 파일 내용이 포함되어 있다고 말한 부분을 놓쳤습니다. 두 환경 중 하나에서 다르게 설정되는 환경 변수가 있습니까? 스프링 부트에는 스테이징/프로덕션의 차이를 유발할 수있는 몇 가지 기본 제공 레버 및 스위치가 있습니다. – 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) 
} 

는, 헤더가 제대로 설정되지 않을 수 있습니다. 왜 이것이 프로덕션 머신에서만 재생산되는지 잘 모르겠습니다.