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.
*
0
(oder einen anderen Wert
* kleiner 1
) zurückliefert, werden Cache-Header erzeugt, die das
* Cachen der Antwort für HTTP/1.0 und HTTP/1.1 vollständig untersagen,0
zurückliefert, wird
* ein für HTTP/1.0-Clients ein Expires
-Header generiert und für
* HTTP/1.1-Clients ein Cache-Control
-Header mit einem
* entsprechenden max-age
-Eintrag. Dies reicht in Kombination mit
* einem sinnvollen Rückgabewert der Methode
* {@link #getLastModified(javax.servlet.http.HttpServletRequest)} vollständig
* für ein einfaches Caching aus.
* 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: *
0
liefert."24afh2w3848adf"
* W/"839482"
* ""
* * Zu beachten: *
0
liefert.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: *
null
zurückliefern!max-age
wird überschrieben,
* wenn die Methode
* {@link #getCacheSeconds(javax.servlet.http.HttpServletRequest)} einen Wert
* größer 0
zurückliefert.0
liefert.Map
mit den Schlüssel-Wert-Paaren für den
* Cache-Control
-Header.
* @throws IllegalArgumentException
* Wenn zu dem Request keine Ressource existiert.
*/
public Map