[utilities COMMIT] in /java-support/trunk/src/main/java/net/shibboleth/utilities/java/support/net: CookieBufferingFil...
noreply at shibboleth.net
noreply at shibboleth.net
Tue Oct 22 17:02:50 EDT 2013
Author: scantor
Date: Tue Oct 22 17:02:50 2013
New Revision: 464
URL: http://svn.shibboleth.net/view/utilities?rev=464&view=rev
Log:
Revise cookie filter, tested on Jetty.
Modified:
java-support/trunk/src/main/java/net/shibboleth/utilities/java/support/net/CookieBufferingFilter.java
java-support/trunk/src/main/java/net/shibboleth/utilities/java/support/net/CookieBufferingHttpServletResponseProxy.java
Modified: java-support/trunk/src/main/java/net/shibboleth/utilities/java/support/net/CookieBufferingFilter.java
URL: http://svn.shibboleth.net/view/utilities/java-support/trunk/src/main/java/net/shibboleth/utilities/java/support/net/CookieBufferingFilter.java?rev=464&r1=463&r2=464&view=diff
==============================================================================
--- java-support/trunk/src/main/java/net/shibboleth/utilities/java/support/net/CookieBufferingFilter.java (original)
+++ java-support/trunk/src/main/java/net/shibboleth/utilities/java/support/net/CookieBufferingFilter.java Tue Oct 22 17:02:50 2013
@@ -18,16 +18,26 @@
package net.shibboleth.utilities.java.support.net;
import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+import javax.annotation.Nonnull;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+import com.google.common.collect.Maps;
+
+import net.shibboleth.utilities.java.support.annotation.constraint.Live;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
/**
* Implementation of an HTTP servlet {@link Filter} which stores the current {@link HttpServletRequest} and
@@ -66,9 +76,64 @@
// in the wrapper and dump the cookies at that point from the wrapper.
// Dump all the cookies set into the real response.
- for (Cookie cookie : responseProxy.getCookies().values()) {
- ((HttpServletResponse) response).addCookie(cookie);
+ responseProxy.dumpCookies();
+ }
+
+ /**
+ * An implementation of {@link HttpServletResponse} which buffers added cookies to
+ * ensure only a single cookie of a given name is eventually set.
+ */
+ private class CookieBufferingHttpServletResponseProxy extends HttpServletResponseWrapper {
+
+ /** Map of delayed cookie additions. */
+ @Nonnull @NonnullElements private Map<String,Cookie> cookieMap;
+
+ /**
+ * Constructor.
+ *
+ * @param response the response to delegate to
+ */
+ public CookieBufferingHttpServletResponseProxy(@Nonnull final HttpServletResponse response) {
+ super(response);
+ cookieMap = Maps.newHashMap();
+ }
+
+ /** {@inheritDoc} */
+ public void addCookie(Cookie cookie) {
+ // Guarantees any existing cookie by this name is replaced.
+ cookieMap.put(cookie.getName(), cookie);
+ }
+
+ /**
+ * Get the map of cookies that will be set.
+ *
+ * @return map of cookies to be set
+ */
+ @Nonnull @NonnullElements @Live protected Map<String,Cookie> getCookies() {
+ return cookieMap;
+ }
+
+ /** {@inheritDoc} */
+ public ServletOutputStream getOutputStream() throws IOException {
+ dumpCookies();
+ return super.getOutputStream();
+ }
+
+ /** {@inheritDoc} */
+ public PrintWriter getWriter() throws IOException {
+ dumpCookies();
+ return super.getWriter();
+ }
+
+ /**
+ * Transfer cookies added into the real response.
+ */
+ protected void dumpCookies() {
+ for (Cookie cookie : cookieMap.values()) {
+ ((HttpServletResponse) getResponse()).addCookie(cookie);
+ }
+ cookieMap.clear();
}
}
-
+
}
More information about the commits
mailing list