Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoakim Erdfelt2014-09-18 18:11:31 +0000
committerSimone Bordet2014-09-23 09:33:43 +0000
commitf3693219f8388eab75a572b010ae759b61985b01 (patch)
treece74edda377456c41bcbf39acc139dede355653e
parent49a32eb1b0da23229441cd2f199ec57caab46cbc (diff)
downloadorg.eclipse.jetty.project-f3693219f8388eab75a572b010ae759b61985b01.tar.gz
org.eclipse.jetty.project-f3693219f8388eab75a572b010ae759b61985b01.tar.xz
org.eclipse.jetty.project-f3693219f8388eab75a572b010ae759b61985b01.zip
444517 - Ensure WebSocketUpgradeFilter is always first in filter chain
* Using Servlet 3.1's ServletContext.addFilter() mechanisms with its FilterRegistration to encourage the WebSocketUpgradeFilter to be first in the filter chain. Note: this is possible, but can be overridden by another call to the same ServletContext.addFilter() using the same techniques to put something in front of the WebSocketUpgradeFilter.
-rw-r--r--jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java31
-rw-r--r--jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketUpgradeFilter.java45
2 files changed, 66 insertions, 10 deletions
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java
index 2e1f7d9462..b21d46db10 100644
--- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java
+++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java
@@ -45,15 +45,16 @@ public class WebSocketServerContainerInitializer implements ServletContainerInit
public static final String ENABLE_KEY = "org.eclipse.jetty.websocket.jsr356";
private static final Logger LOG = Log.getLogger(WebSocketServerContainerInitializer.class);
-
+ /**
+ * Jetty Native approach.
+ * <p>
+ * Note: this will add the Upgrade filter to the existing list, with no regard for order. It will just be tacked onto the end of the list.
+ */
public static ServerContainer configureContext(ServletContextHandler context)
{
// Create Filter
WebSocketUpgradeFilter filter = WebSocketUpgradeFilter.configureContext(context);
- // Store reference to the WebSocketUpgradeFilter
- context.setAttribute(WebSocketUpgradeFilter.class.getName(),filter);
-
// Create the Jetty ServerContainer implementation
ServerContainer jettyContainer = new ServerContainer(filter,filter.getFactory(),context.getServer().getThreadPool());
context.addBean(jettyContainer);
@@ -64,6 +65,26 @@ public class WebSocketServerContainerInitializer implements ServletContainerInit
return jettyContainer;
}
+ /**
+ * Servlet 3.1 approach.
+ * <p>
+ * This will use Servlet 3.1 techniques on the {@link ServletContext} to add a filter at the start of the filter chain.
+ */
+ public static ServerContainer configureContext(ServletContext context, ServletContextHandler jettyContext)
+ {
+ // Create Filter
+ WebSocketUpgradeFilter filter = WebSocketUpgradeFilter.configureContext(context);
+
+ // Create the Jetty ServerContainer implementation
+ ServerContainer jettyContainer = new ServerContainer(filter,filter.getFactory(),jettyContext.getServer().getThreadPool());
+ jettyContext.addBean(jettyContainer);
+
+ // Store a reference to the ServerContainer per javax.websocket spec 1.0 final section 6.4 Programmatic Server Deployment
+ context.setAttribute(javax.websocket.server.ServerContainer.class.getName(),jettyContainer);
+
+ return jettyContainer;
+ }
+
@Override
public void onStartup(Set<Class<?>> c, ServletContext context) throws ServletException
{
@@ -111,7 +132,7 @@ public class WebSocketServerContainerInitializer implements ServletContainerInit
ServletContextHandler jettyContext = (ServletContextHandler)handler;
// Create the Jetty ServerContainer implementation
- ServerContainer jettyContainer = configureContext(jettyContext);
+ ServerContainer jettyContainer = configureContext(context, jettyContext);
// Store a reference to the ServerContainer per javax.websocket spec 1.0 final section 6.4 Programmatic Server Deployment
context.setAttribute(javax.websocket.server.ServerContainer.class.getName(),jettyContainer);
diff --git a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketUpgradeFilter.java b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketUpgradeFilter.java
index b2a9deb092..374b072607 100644
--- a/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketUpgradeFilter.java
+++ b/jetty-websocket/websocket-server/src/main/java/org/eclipse/jetty/websocket/server/WebSocketUpgradeFilter.java
@@ -20,10 +20,13 @@ package org.eclipse.jetty.websocket.server;
import java.io.IOException;
import java.util.EnumSet;
+
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
+import javax.servlet.FilterRegistration;
+import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
@@ -58,16 +61,48 @@ public class WebSocketUpgradeFilter extends ContainerLifeCycle implements Filter
public static WebSocketUpgradeFilter configureContext(ServletContextHandler context)
{
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
-
WebSocketUpgradeFilter filter = new WebSocketUpgradeFilter(policy);
+
+ String name = "Jetty_WebSocketUpgradeFilter";
+ String pathSpec = "/*";
+ EnumSet<DispatcherType> dispatcherTypes = EnumSet.of(DispatcherType.REQUEST);
+
FilterHolder fholder = new FilterHolder(filter);
- fholder.setName("Jetty_WebSocketUpgradeFilter");
- fholder.setDisplayName("WebSocket Upgrade Filter");
+ fholder.setName(name);
+ context.addFilter(fholder,pathSpec,dispatcherTypes);
+
+ if (LOG.isDebugEnabled())
+ {
+ LOG.debug("Adding [{}] {} mapped to {} to {}",name,filter,pathSpec,context);
+ }
+
+ // Store reference to the WebSocketUpgradeFilter
+ context.setAttribute(WebSocketUpgradeFilter.class.getName(),filter);
+
+ return filter;
+ }
+
+ public static WebSocketUpgradeFilter configureContext(ServletContext context)
+ {
+ WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
+ WebSocketUpgradeFilter filter = new WebSocketUpgradeFilter(policy);
+
+ String name = "Jetty_Dynamic_WebSocketUpgradeFilter";
String pathSpec = "/*";
- context.addFilter(fholder,pathSpec,EnumSet.of(DispatcherType.REQUEST));
+ EnumSet<DispatcherType> dispatcherTypes = EnumSet.of(DispatcherType.REQUEST);
+ boolean isMatchAfter = false;
+ String urlPatterns[] =
+ {
+ pathSpec
+ };
+
+ FilterRegistration.Dynamic dyn = context.addFilter(name,filter);
+ dyn.addMappingForUrlPatterns(dispatcherTypes,isMatchAfter,urlPatterns);
if (LOG.isDebugEnabled())
- LOG.debug("Adding {} mapped to {} to {}",filter,pathSpec,context);
+ {
+ LOG.debug("Adding [{}] {} mapped to {} to {}",name,filter,pathSpec,context);
+ }
// Store reference to the WebSocketUpgradeFilter
context.setAttribute(WebSocketUpgradeFilter.class.getName(),filter);

Back to the top