01: /*
02: * Licensed to the Apache Software Foundation (ASF) under one or more
03: * contributor license agreements. The ASF licenses this file to You
04: * under the Apache License, Version 2.0 (the "License"); you may not
05: * use this file except in compliance with the License.
06: * You may obtain a copy of the License at
07: *
08: * http://www.apache.org/licenses/LICENSE-2.0
09: *
10: * Unless required by applicable law or agreed to in writing, software
11: * distributed under the License is distributed on an "AS IS" BASIS,
12: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13: * See the License for the specific language governing permissions and
14: * limitations under the License. For additional information regarding
15: * copyright in this work, please see the NOTICE file in the top level
16: * directory of this distribution.
17: */
18:
19: package org.apache.roller.ui.rendering.util;
20:
21: import org.apache.commons.logging.Log;
22: import org.apache.commons.logging.LogFactory;
23:
24: import javax.servlet.http.HttpServletRequest;
25: import javax.servlet.http.HttpServletResponse;
26:
27: /**
28: * Utility class to localize the modification date header-related logic.
29: */
30: public class ModDateHeaderUtil {
31: private static final Log log = LogFactory
32: .getLog(ModDateHeaderUtil.class);
33:
34: // Utility class with static methods; inhibit construction
35: private ModDateHeaderUtil() {
36:
37: }
38:
39: /**
40: * Sets the HTTP response status to 304 (NOT MODIFIED) if the request contains an
41: * If-Modified-Since header that specifies a time that is
42: * at or after the time specified by the value of lastModifiedTimeMillis
43: * <em>truncated to second granularity</em>. Returns true if
44: * the response status was set, false if not.
45: *
46: * @param request
47: * @param response
48: * @param lastModifiedTimeMillis
49: * @return true if a response status was sent, false otherwise.
50: */
51: public static boolean respondIfNotModified(
52: HttpServletRequest request, HttpServletResponse response,
53: long lastModifiedTimeMillis) {
54: long sinceDate = request.getDateHeader("If-Modified-Since");
55: // truncate to seconds
56: lastModifiedTimeMillis -= (lastModifiedTimeMillis % 1000);
57: log.debug("since date = " + sinceDate);
58: log.debug("last mod date (trucated to seconds) = "
59: + lastModifiedTimeMillis);
60: if (lastModifiedTimeMillis <= sinceDate) {
61: log.debug("NOT MODIFIED " + request.getRequestURL());
62: response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
63: return true;
64: } else {
65: return false;
66: }
67: }
68:
69: /**
70: * Set the Last-Modified header using the given time in milliseconds. Note that because the
71: * header has the granularity of one second, the value will get truncated to the nearest second that does not
72: * exceed the provided value.
73: * <p/>
74: * This will also set the Expires header to a date in the past. This forces clients to revalidate the cache each
75: * time.
76: *
77: * @param response
78: * @param lastModifiedTimeMillis
79: */
80: public static void setLastModifiedHeader(
81: HttpServletResponse response, long lastModifiedTimeMillis) {
82: response.setDateHeader("Last-Modified", lastModifiedTimeMillis);
83: // Force clients to revalidate each time
84: // See RFC 2616 (HTTP 1.1 spec) secs 14.21, 13.2.1
85: response.setDateHeader("Expires", 0);
86: // We may also want this (See 13.2.1 and 14.9.4)
87: // response.setHeader("Cache-Control","must-revalidate");
88: }
89: }
|