Fehler bei ungültigem If-Modified-Since in CacheControlInterceptor behoben
[percentcodec] / utils / cachecontrol / src / main / java / de / halbekunst / utils / cachecontrol / CacheControlInterceptor.java
index 54a14de..bc2dd3d 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());
@@ -117,7 +127,7 @@ public class CacheControlInterceptor implements HandlerInterceptor {
       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 +157,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 +176,7 @@ public class CacheControlInterceptor implements HandlerInterceptor {
       }
 
       return true;
-  }
+    }
     catch (ClassCastException e) {
       return true;
     }