+
+ String ifNoneMatch = request.getHeader(HEADER_IF_NONE_MATCH);
+ String eTag = cacheable.getETag(request);
+
+ /**
+ * 304-Antworten sollen nach dem {@plainlink
+ * http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5 RFC
+ * 2616, Abschnitt 10.3.5} einen ETag-Header enthalten, wenn auch die
+ * 200-Antwort einen enthalten hätte.
+ */
+ if (eTag != null)
+ response.setHeader(HEADER_ETAG, eTag);
+
+
+ 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 {}", url, new Date(ifModifiedSince));
+
+ if (ifNoneMatch == null) {
+ /** Neue Anfrage oder HTTP/1.0 Client! */
+ log.debug("{}: ETag nicht gesetzt -> 304", url);
+ response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
+ return false;
+ }
+ }
+
+ if (ifNoneMatch != null && ifNoneMatch.equals(eTag)) {
+ log.debug("{}: ETag {} not changed -> 304 ", url, ifNoneMatch);
+ response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
+ return false;
+ }
+
+
+ log.debug("{}: first up!", url);
+