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 (더 명확하게 설명 됨)입니다.
호프가 도움이 되었기를 바랍니다.