CacheControlInterceptor prüft ETag jetzt auch, wenn If-Modified-Since fehlt
[percentcodec] / utils / cachecontrol / src / main / java / de / halbekunst / utils / cachecontrol / CacheControlInterceptor.java
index 35b7753..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,13 +114,12 @@ 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!! */
@@ -166,7 +175,7 @@ public class CacheControlInterceptor implements HandlerInterceptor {
       }
 
       return true;
-  }
+    }
     catch (ClassCastException e) {
       return true;
     }