CacheControlInterceptor prüft ETag jetzt auch, wenn If-Modified-Since fehlt
[percentcodec] / utils / cachecontrol / src / main / java / de / halbekunst / utils / cachecontrol / CacheControlInterceptor.java
index 54a14de..088e775 100644 (file)
@@ -65,7 +65,14 @@ public class CacheControlInterceptor implements HandlerInterceptor {
         return true;
       }
 
-      long ifModifiedSince = request.getDateHeader(HEADER_IF_MODIFIED_SINCE);
+      long ifModifiedSince = -1;
+      try {
+        ifModifiedSince = request.getDateHeader(HEADER_IF_MODIFIED_SINCE);
+      }
+      catch (Exception e) {
+        log.error("Exception while fetching If-Modified-Since: {}", e);
+      }
+
       long lastModified = cacheable.getLastModified(request);
 
       /**
@@ -89,11 +96,14 @@ public class CacheControlInterceptor implements HandlerInterceptor {
       }
 
 
-      if (ifModifiedSince >= lastModified) {
+      if (ifModifiedSince >= lastModified && lastModified > 0) {
         /**
          * request.getDateHeader liefert die Zeit als long, oder -1, wenn der
          * Header nicht existiert. D.h., wenn "If-Modified-Since" nicht gesetzt
          * ist, wird die komplette Seite ausgeliefert.
+         * Der zusätzliche Test, ob lastModified größer 0 ist, ist nötig, um
+         * Fehler auszuschließen, wenn die Implementierung von Cachable
+         * negative Werte für Last-Modified zurückliefert.
          */
         if (log.isDebugEnabled())
           log.debug("Not modified since {}: {}", new Date(ifModifiedSince), request.getRequestURI());
@@ -104,20 +114,19 @@ public class CacheControlInterceptor implements HandlerInterceptor {
           response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
           return false;
         }
-        else {
-          if (ifNoneMatch.equals(eTag)) {
-            log.debug("ETag {} not changed: 304 {}", ifNoneMatch, request.getRequestURI());
-            response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
-            return false;
-          }
-        }
+      }
+
+      if (ifNoneMatch != null && ifNoneMatch.equals(eTag)) {
+        log.debug("{}: ETag {} not changed -> 304 ", request.getRequestURI(), ifNoneMatch);
+        response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
+        return false;
       }
 
       /** HTTP/1.1-Caching-Header richtig setzen!! */
       response.setDateHeader(HEADER_LAST_MODIFIED, lastModified);
 
       /** Cache-Control für HTTP/1.1-Clients generieren */
-      Map<String, String> cacheControl = new HashMap<String, String>(cacheable.getCacheControll(request));
+      Map<String, String> cacheControl = new HashMap<String, String>(cacheable.getCacheControl(request));
 
       /**
        * Wenn eins JSESSIONID in der URL enthalten ist, darf die Anfrage nur vom
@@ -147,7 +156,7 @@ public class CacheControlInterceptor implements HandlerInterceptor {
          * zurückgeliefert werden!
          *
          * Den Wert als <code>max-age</code> zu den Schlüssel-Wert-Paaren für den
-         * <code>Cache-Controll</code>-Header hinzufügen und einen entsprechenden
+         * <code>Cache-Control</code>-Header hinzufügen und einen entsprechenden
          * <code>Expires</code>-Header für HTTP/1.0-Clients setzen.
          */
         cacheControl.put("max-age", Integer.toString(cacheSeconds));
@@ -166,7 +175,7 @@ public class CacheControlInterceptor implements HandlerInterceptor {
       }
 
       return true;
-  }
+    }
     catch (ClassCastException e) {
       return true;
     }