X-Git-Url: https://juplo.de/gitweb/?p=percentcodec;a=blobdiff_plain;f=cachecontrol%2Fsrc%2Fmain%2Fjava%2Fde%2Fhalbekunst%2Fjuplo%2Fcachecontrol%2FCacheable.java;fp=cachecontrol%2Fsrc%2Fmain%2Fjava%2Fde%2Fhalbekunst%2Fjuplo%2Fcachecontrol%2FCacheable.java;h=75ac11020a7dcfa180dcb18a8f72b2690c5f5912;hp=0000000000000000000000000000000000000000;hb=f3ec05942f7f5cbf3417bf71b5727b9007739bfd;hpb=c3556bca6ffcc6556393d77fa773b2703e9ad99b diff --git a/cachecontrol/src/main/java/de/halbekunst/juplo/cachecontrol/Cacheable.java b/cachecontrol/src/main/java/de/halbekunst/juplo/cachecontrol/Cacheable.java new file mode 100644 index 00000000..75ac1102 --- /dev/null +++ b/cachecontrol/src/main/java/de/halbekunst/juplo/cachecontrol/Cacheable.java @@ -0,0 +1,153 @@ +package de.halbekunst.juplo.cachecontrol; + + +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +/** + * Wenn ein Handler (i.A. eine Impelementierung von {@Controller}), + * dieses Interface implementiert, dann schreibt + * {@link CachingInterceptor} HTTP/1.1-Caching-Header nach + * {@linkplain http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html RFC 2616} + * in den Response. + * + * @see CachingInterceptor + * @author kai + */ +public interface Cacheable { + public boolean accepts(HttpServletRequest request); + + /** + * Wenn die Methode false zurückliefert, werden von + * {@link CachingDispatcherServlet#isRessourceModified(HttpServletRequest, HttpServletResponse, Cacheable)} + * keinerlei HTTP/1.1-Cache-Header in den Response eingebaut. + *

+ * Über diese Methode kann z.B. gesteuert werden, dass für eine bestimmte + * HTTP-Methode (z.B. POST) keine Cache-Header generiert werden. + * + * @see CachingDispatcherServlet + * @param request + * Der aktuelle HTTP-Request + * @return true, wenn Caching-Header in den Response geschrieben + * werden sollen, sonst false. + * @throws IllegalArgumentException + * Wenn zu dem Request keine Ressource existiert. + */ + public boolean isGenerateCacheHeaders(HttpServletRequest request) throws IllegalArgumentException; + + /** + * Diese Methode ermöglicht eine einfache, zentrale Steuerung des + * Caching-Verhaltens. + *

+ *

+ * Zu beachten: Wenn die Methode + * {@link #getCacheControl(javax.servlet.http.HttpServletRequest)} weitere + * Schlüssel-Wert-Paare für den Cache-Control-Header liefert, + * werden diese ergänzt. Wenn in der Rückgabe ein Wert für + * max-age enthalten ist, wir er allerdings von dem durch diese + * Methode vorgegebenen Wert überschrieben! + * + * @see #getLastModified(javax.servlet.http.HttpServletRequest) + * @see #getCacheControl(javax.servlet.http.HttpServletRequest) + * @param request + * Der aktuelle HTTP-Request + * @return Die gewünschte Cache-Zeit in Sekunden, oder 0, wenn + * Caching aktiv unterbunden werden soll bzw. einen Wert kleiner + * 0, wenn kein Expires-Header generiert + * werden soll. + * @throws IllegalArgumentException + * Wenn zu dem Request keine Ressource existiert. + */ + public int getCacheSeconds(HttpServletRequest request) throws IllegalArgumentException; + + /** + * Zeitpunkt, zu dem die Ressource zuletzt verändert wurde. Erwartet wird eine + * Zeitangabe in Millisekunden seit dem Unix-0-Zeitpunkt, wie sie von + * {@link HttpServletResponse#setDateHeader(String, long)} erwartet wird. + *

+ * Zu beachten: + *

+ * + * @see #getCacheSeconds(javax.servlet.http.HttpServletRequest) + * @param request + * Der aktuelle HTTP-Request + * @return Zeitstempel, zu dem die Ressource zuletzt modifiziert wurde. + * @throws IllegalArgumentException + * Wenn zu dem Request keine Ressource existiert. + */ + public long getLastModified(HttpServletRequest request) throws IllegalArgumentException; + + /** + * Frei wählbares ETag nach {@linkplain http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19 RFC 2616, + * Abschnitt 14.19 ETag}. Der ETag wird unverändert übernommen und muss den + * Bedingungen aus dem RFC 2616 entsprechen. Beispiele für erlaubte Werte: + * + * Merke: Der wert ist immer in doppelte Anführungszeichen + * einzuschließen! + *

+ * Zu beachten: + *

+ * + * @see #getCacheSeconds(javax.servlet.http.HttpServletRequest) + * @param request + * Der aktuelle HTTP-Request + * @return Das zu verwendende ETag, oder null, wenn der Header + * nicht generiert werden soll. + * @throws IllegalArgumentException + * Wenn zu dem Request keine Ressource existiert. + */ + public String getETag(HttpServletRequest request) throws IllegalArgumentException; + + /** + * Diese Methode liefert eine Map mit Schlüssel-Wert-Paaren für den + * HTTP/1.1-Header Cache-Control (s. {@plainlink + * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3 RFC2616, + * Abschnitt 14.9.3}). + *

+ * Zu beachten: + *

+ * + * @see #getCacheSeconds(javax.servlet.http.HttpServletRequest) + * @param request + * Der aktuelle HTTP-Request + * @return Eine Map mit den Schlüssel-Wert-Paaren für den + * Cache-Control-Header. + * @throws IllegalArgumentException + * Wenn zu dem Request keine Ressource existiert. + */ + public Map getCacheControl(HttpServletRequest request) throws IllegalArgumentException; +}