Http 캐 시 Last - Modified, ETag, Expires 의 자바 종료 해결 방법

6538 단어
Http 캐 시 Last - Modified, ETag, Expires 의 자바 종료 해결 방법
http://www.jdon.com/40381
Last - Modified 와 Expires 는 브 라 우 저 를 대상 으로 하고 ETag 는 클 라 이언 트 와 무관 하기 때문에 적합 합 니 다.
REST 구조 중.둘 다 브 라 우 저 에 적용 되 는 차이 점 은 Expires 날짜 가 도착 하기 전에 브 라 우 저 는 더 이상 새로운 요청 을 하지 않 습 니 다. 사용자 가 브 라 우 저 에 따라 새로 고침 을 하지 않 는 한 Last - Modified 와 Expires 는 기본적으로 브 라 우 저가 서버 에 요청 하 는 횟수 를 낮 추고 ETag 는 클 라 이언 트 와 서버 간 의 연락 에 중심 을 둡 니 다.
Last - Modified 와 Expires 를 먼저 이야기 합 니 다. 최신 Tomcat 7 은 ExpireFilter 를 용기 에 넣 으 면 자바 WEB 도 Apache 의 Mod 와 같 을 수 있 습 니 다.expire 모듈 처럼 Http 머리 를 통일 적 으로 설 정 했 습 니 다. 그러나 응답 문서 형식 만 통일 적 으로 설정 하고 판단 합 니 다. 예 를 들 어 text / html 또는 text / image 또는 / css 등 개별 URL 로 출력 되 는 jsp 를 맞 추 려 면 안 됩 니 다. url rewrite 는 가능 하 다 고 합 니 다. 그러나 URL 을 설정 파일 에 다시 설정 해 야 합 니 다. 귀 찮 습 니 다. jsp 가 바 뀌 면 영향 이 큽 니 다.또 하나의 문 제 는 웹. xml 에 Tomcat 7 용기 의 ExpireFilter 를 설정 하여 용기 와 결합 하여 이식 성 이 떨어진다 는 것 이다 (Resin 에 이식 하면 안 된다).
그래서
JiveJdon 4.2 최신 버 전에 서 다음 코드 를 추가 하여 서버 측 에서 클 라 이언 트 에서 온 Last - Modified 와 현재 시간 을 판단 합 니 다. 기한 이 지나 지 않 으 면 response. setStatus 를 304 로 설정 하면 뒤의 각종 Jsp 인터페이스 계산 을 중지 하고 브 라 우 저 에 304 의 응답 패 키 지 를 직접 되 돌려 줄 수 있 습 니 다. JSP 페이지 도 클 라 이언 트 에 출력 되 지 않 습 니 다.대역 폭 을 절약 하여 더욱 상호작용 이 필요 한 실시 간 요청 을 하 다.
ETag 에 대해 서 는 ETag 정의: RFC 2616 (즉 HTTP / 1.1) 에서 ETag 가 어떤 형식 인지 설명 하지 않 았 습 니 다. 작은 따옴표 로 묶 으 면 됩 니 다. 따라서 파일 의 hash, 심지어 Last - Modified 를 사용 할 수 있 습 니 다. 다음은 서버 에서 돌아 오 는 형식 입 니 다.
ETag: "50b1c1d4f775c 61: df3" 클 라 이언 트 가 서버 에 보 낸 요청: If - None - Match: W / "50b1c1d4f775c 61: df3" 이렇게 J2EE / JavaEE 서버 에서 ETag 가 변 하지 않 았 다 면 상태 304 로 돌아 가 Last - Modified 와 Expires 와 유사 한 효 과 를 거 둘 것 이 라 고 판단 합 니 다.
Last - Modified 와 Expires 의 차이 점 은 Expires 날짜 가 지나 면 서버 에서 JSP 전체 응답 을 다시 보 낼 것 입 니 다.또는 사용자 가 브 라 우 저의 새로 고침 단 추 를 강하 게 누 르 면 서버 도 응답 해 야 합 니 다. apache 등 정적 페이지 출력 도 마찬가지 입 니 다. 그러나 이때 동적 페이지 가 역할 을 발휘 합 니 다. 만약 에 JSP 와 관련 된 업무 분야 모델 이 업데이트 되 지 않 았 다 면 원래 와 같 으 면 동적 페이지 를 출력 할 필요 가 없습니다 (브 라 우 저 클 라 이언 트 가 이미 있 습 니 다).Etag 에서 마지막 으로 설 정 된 영역 모델 대상 의 수정 날 짜 를 가 져 와 현재 메모리 에 있 는 영역 모델 (In - memory Model) 수정 날짜 와 비교 합 니 다. 수정 날짜 가 일치 하면 영역 모델 이 업데이트 되 지 않 았 음 을 표시 합 니 다. 응답 팩 304 로 돌아 가면 브 라 우 저 는 로 컬 을 계속 사용 합 니 다.
캐 시 된 이 페이지 는 대역 폭 전송 을 다시 절약 했다.
위 Expire 와 Etag 를 통 해 두 번
캐 시 는 서버 의 응답 부 하 를 크게 낮 출 수 있 습 니 다. 만약 에 응용 프로그램 이 상태 가 집중 적 으로 수정 되 고 실시 간 으로 출력 되 는 것 이 아니 라 분산 적 으로 수정 한 다음 에 배 포 됩 니 다. 예 를 들 어 개인 공간 개인 블 로그 (모든 사람 이 자신의 상 태 를 수정 할 뿐 전체 에 영향 을 주지 않 습 니 다) 나 QQ 류 가 개인 도구 와 같 으 면 이런 방법 을 사용 하면 효과 가 매우 뚜렷 합 니 다.실제 적 으로 동적 페이지 정적 화 기술 이지 만 일반적인 일보 다 먼저 페이지 정적 화 를 하 는 것 이 유연 하고 강하 다.
InfoQ 의 그 편:http://www.infoq.com/articles/etags또한 MD5 계산 으로 넣 었 습 니 다. Md5 계산 은 약간 복잡 하고 부하 가 많 습 니 다. 어떤 사람 은 Hibernate 나 데이터 베이스 트리거 를 결합 하여 데이터 베 이 스 를 업데이트 하 는 지 판단 하여 Etag 의 업 데 이 트 를 결정 합 니 다. 이것 은 표현 층 과 지구 층 을 결합 시 킵 니 다. 왜냐하면
JiveJdon 은 MDD / DDD 모델 구동 구 조 를 채 택 했 습 니 다. 표현 층 의 Etag 업 데 이 트 는 중개업 무 층 의 모델 대상 수정 날짜 에 따라 결정 되 고 데이터 베이스 층 과 관련 되 지 않 으 며 서버 가 됩 니 다.
캐 시 업데이트 와 http 의 Etag 업데이트 가 일치 하 는 효 과 는 소나무 결합 디자인 과 성능 에 있어 종합 적 인 균형 을 이룬다.
코드 는 다음 과 같 습 니 다:

public static boolean checkHeaderCache(long adddays, long modelLastModifiedDate, HttpServletRequest request, HttpServletResponse response) {
// com.jdon.jivejdon.presentation.filter.ExpiresFilter
request.setAttribute("myExpire", adddays);

// convert seconds to ms.
long adddaysM = adddays * 1000;
long header = request.getDateHeader("If-Modified-Since");
long now = System.currentTimeMillis();
if (header > 0 && adddaysM > 0) {
if (modelLastModifiedDate > header) {
// adddays = 0; // reset
response.setStatus(HttpServletResponse.SC_OK);
return true;
}
if (header + adddaysM > now) {
// during the period happend modified
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
return false;
}
}

// if over expire data, see the Etags;
// ETags if ETags no any modified
String previousToken = request.getHeader("If-None-Match");
if (previousToken != null && previousToken.equals(Long.toString(modelLastModifiedDate))) {
// not modified
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
return false;
}
// if th model has modified , setup the new modified date
response.setHeader("ETag", Long.toString(modelLastModifiedDate));
setRespHeaderCache(adddays, request, response);
return true;

}

public static boolean setRespHeaderCache(long adddays, HttpServletRequest request, HttpServletResponse response) {
request.setAttribute("myExpire", adddays);

long adddaysM = adddays * 1000;
String maxAgeDirective = "max-age=" + adddays;
response.setHeader("Cache-Control", maxAgeDirective);
response.setStatus(HttpServletResponse.SC_OK);
response.addDateHeader("Last-Modified", System.currentTimeMillis());
response.addDateHeader("Expires", System.currentTimeMillis() + adddaysM);
return true;
}

좋은 웹페이지 즐겨찾기