1. 최초 요청 시 HTTP Request와 Response

Client's request

Client  ------------------------------> Server

Request URL: http://i1.daumcdn.net/cfs.tistory/static/images/logo.gif


Server's response

Client <------------------------------ Server

Header에 "Last-Modified"를 설정하여 응답한다. (아래의 그림 참조)




2. 재 요청 시 HTTP Request Response

Client's request

Client  ------------------------------> Server

Request URL: http://i1.daumcdn.net/cfs.tistory/static/images/logo.gif

최초 응답 시 받은 "Last-Modified"를 참조하여 Header에 "If-Modified-Since"를 설정하여 요청한다.
(Browser가 알아서 설정)

Server's response

Client <------------------------------ Server

Server는 "If-Modified-Since" 값과 비교하여 변경 사항이 없으면 HTTP Status Code 304로  응답한다.

(아래의 그림 참조)



3. Code Snipet


public void downloadResource(@PathVariable String resourceName,
						       HttpServletRequest request,
						      HttpServletResponse response) {
																				
		WebResource webResource = ResourceService.getResource(resourceName);
		long lastModified = webResource.getLastModified();
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(lastModified);
		calendar.set(Calendar.MILLISECOND, 0);
		lastModified = calendar.getTimeInMillis();
		
		long ifModifiedSince = request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE);
		if (ifModifiedSince != -1 && ifModifiedSince >= lastModified) {
			response.setStatus(HttpStatus.SC_NOT_MODIFIED);
			return;
		}
		
		response.setDateHeader(HttpHeaders.LAST_MODIFIED, lastModified);
		...
	}