2017-11-08 4 views
0

Google 서비스에서 Spring MVC를 4.0에서 4.3으로 업그레이드했습니다. ETag 형식이 "GET"메서드의 응답 헤더에서 변경되었습니다. "GET"호출을하는 클라이언트는 응답 헤더에 큰 따옴표가있는 ETag를 얻습니다. 이전에는 응답 헤더의 ETag에 "GET"메소드에 대한 큰 따옴표가 없었습니다. 예를 들어스프링 MVC 응답 헤더 : ETag는 GET 요청에 대해 큰 따옴표를 사용하지만 PUT 요청에는 포함하지 않습니다.

:

Now: etag →"TVMzTWFpbmxpbmVEZXZvLTI5ODIxMQ" 
Previously: etag →TVMzTWFpbmxpbmVEZXZvLTI5ODIxMQ 

직전과 같은 헤더에있는 ETag 주위에 "PUT"요청이없는 따옴표의 응답.

누구나 어떤 아이디어가 있습니까?

답변

0

Spring 4.2.x 이전에는 ETag 헤더에 대한 관리가 없었습니다. 그 이후로 소개되었습니다 HttpEntityMethodProcessor. 이 클래스는 시간이 지남에 따라 발전했으며 ETag 헤더의 관리는 RFC을 (또는 충분히 가깝게) 존중합니다. 이 commit에서 볼 수 있듯이

이, 봄 팀의 관리와 문제 해결 :

이전이 커밋에 대한 응답에서 헤더를 LASTMODIFIED

수정 실종의 ETag /는 HttpEntityMethodProcessor은 피할 것 조건부 요청을 처리하기 위해 ServletWebRequest을 호출하기 전에 ETag/Last-Modified 응답 헤더를 작성하십시오. 이것은 에 대해 수행되었으므로 기본 서블릿 응답에 이미 이라는 헤더가 있으므로 중복 된 응답 헤더 값을 피하십시오.

이 경우 GET/HEAD 요청은 이 올바르게 처리되므로 여전히 필요합니다. ServletWebRequest 그 경우에 그 헤더를 기록하지 않습니다 반면에 - 그러나 HttpEntityMethodProcessor는 개발자가 목적에 응답 헤더를 추가하는 상황을 관리해야하기 때문에 PUT/PATCH/POST 응답에 대한 결정을해서는 안됩니다.

수정 코드의 관련 부분은 here입니다.

그래서 기본적으로, 당신이 수동는 다음 재현, 또는 HEAD에게 방법, 프레임 워크는 그것을 제거를 얻을 200 상태의 경우에, 의 ETag 헤더를 추가. 그렇기 때문에 PUT에는 큰 따옴표가 없습니다.HttpEntityMethodProcessor에서

: ServletWebRequest에서 다음

if (inputMessage.getMethod() == HttpMethod.GET || inputMessage.getMethod() == HttpMethod.HEAD) { 
     responseHeaders.remove(HttpHeaders.ETAG); 
     responseHeaders.remove(HttpHeaders.LAST_MODIFIED); 
    } 

:

private String padEtagIfNecessary(String etag) { 
    if (!StringUtils.hasLength(etag)) { 
     return etag; 
    } 
    if ((etag.startsWith("\"") || etag.startsWith("W/\"")) && etag.endsWith("\"")) { 
     return etag; 
    } 
    return "\"" + etag + "\""; 
} 

당신이 볼 수 있듯이, 이것은 chapter 2.4 of the RFC 존중 :

2.4. 이 가 발생하지 실현에 경우를 제외하고

오 엔티티 태그 검사기를 전송해야하는 경우 원 서버, GET 또는 HEAD하는 엔티티 - 태그와 마지막 수정 날짜 200 (OK) 응답에

를 사용하는 방법 하나. 강한 엔터티 태그를 발송하는 것이 실현성이 없을 성능 고려 사항이 을 약한 엔터티 태그를 사용해도 될 때 또는

는 강한 엔터티 태그 대신 약한 엔터티 태그를 발송할 수도있다.

o 보낼 가능성이있는 경우 Last-Modified 값을 보내야합니다.

다시 말해서 원 서버의 기본 동작은 검색 요청에 대한 응답에서 이 강력한 엔터티 태그와 Last-Modified 값을 모두 보내어 성공한 ​​것입니다.

그러나 이전 버전과 호환되지 않으며 개발자가이 버전 이전에 사용할 수 있었던 것을 깨뜨렸으며 건너 뛰거나 덮어 쓸 가능성이 없습니다.

여기에 ETag from the MDN (더 명확하게 설명 됨)입니다.

호프가 도움이 되었기를 바랍니다.

관련 문제