Author: pete
Date: Sat Sep 11 10:32:04 2010
New Revision: 996115
URL: http://svn.apache.org/viewvc?rev=996115&view=rev
Log:
helper method to utilize caching easier
Modified:
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java
Modified:
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java?rev=996115&r1=996114&r2=996115&view=diff
==============================================================================
---
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java
(original)
+++
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java
Sat Sep 11 10:32:04 2010
@@ -28,6 +28,7 @@ import org.apache.wicket.request.UrlDeco
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.string.Strings;
/**
@@ -35,6 +36,8 @@ import org.apache.wicket.util.string.Str
*/
public final class RequestUtils
{
+ public static final long MAX_CACHE_DURATION = 60 * 60 * 24 * 365; //
one year, maximum recommended cache duration
+
/**
* Decode the provided queryString as a series of key/ value pairs and
set them in the provided
* value map.
@@ -260,9 +263,76 @@ public final class RequestUtils
*/
public static void disableCaching(WebResponse response)
{
+ Args.notNull(response, "response");
response.setDateHeader("Date", System.currentTimeMillis());
response.setDateHeader("Expires", 0);
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
}
+
+ /**
+ * enable caching for the given response
+ * <p/>
+ * The [duration] is the maximum time in seconds until the response is
invalidated from the cache. The
+ * maximum duration should not exceed one year, based on
+ * <a
href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html">RFC-2616</a>.
+ * <p/>
+ * The [cachePublic] flag will let you control if the response may be
cached
+ * by public caches or just by the client itself. This sets the http
response header
+ *
+ * <ul>
+ * <li><code>[Cache-Control: public]</code> if <code>cachePublic =
true</code></li>
+ * <li><code>[Cache-Control: private]</code> if <code>cachePublic =
false</code></li>
+ * </ul>
+ * <p/>
+ * Details on <code>Cache-Control</code> header can be found
+ * <a
href="http://palisade.plynt.com/issues/2008Jul/cache-control-attributes">here</a>
+ * or in <a
href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html">RFC-2616</a>.
+ * <p/>
+ * Choose <code>cachePublic = false</code> wisely since setting
<code>Cache-Control: private</code>
+ * may cause trouble with some versions of Firefox which will not cache
SSL content at all. More details
+ * on this Firefox issue can be found <a
href="http://blog.pluron.com/2008/07/why-you-should.html">here</a>.
+ * <p/>
+ * Never set <code>cachePublic=true</code> when the response is
confidential or client-specific. You
+ * don't want to see your sensitive private data on some public proxy.
+ * <p/>
+ * Unless the response really is confidential / top-secret or
client-specific the general advice is
+ * to always prefer <code>cachePublic=true</code> for best network
performance.
+ *
+ * @param response
+ * response that should be cacheable
+ * @param duration
+ * duration in seconds that the response may be cached
+ * @param cachePublic
+ * If <code>true</code> all caches are allowed to cache the
response.
+ * If <code>false</code> only the client may cache the
response (if at all).
+ *
+ * @see RequestUtils#MAX_CACHE_DURATION
+ */
+ public static void enableCaching(WebResponse response, long duration,
boolean cachePublic)
+ {
+ Args.notNull(response, "response");
+
+ if(duration < 0)
+ throw new IllegalArgumentException("duration must be a
positive value");
+
+ // Get current time
+ long now = System.currentTimeMillis();
+
+ // Time of message generation
+ response.setDateHeader("Date", now);
+
+ // Time for cache expiry = now + duration
+ response.setDateHeader("Expires", now + (duration * 1000L));
+
+ // Set caching scope
+ String scope = cachePublic ? "public" : "private";
+
+ // Enable caching and set max age
+ response.setHeader("Cache-Control", scope + ", max-age=" +
duration);
+
+ // Let caches distinguish between compressed and uncompressed
+ // versions of the resource so they can serve them properly
+ response.setHeader("Vary", "Accept-Encoding");
+ }
}