Repository: wicket
Updated Branches:
  refs/heads/master 40ab5ecfa -> c0181dd0d


WICKET-6360 WebSocket fails when url-based jsessionid is used

Manually append ';jsessionid=xyz' in the ws:// url when the session is tracked 
via URL or there is no cookie or the cookie value is invalid.

Works fine in Tomcat 8.5.13.
Fails on Jetty 9.4.4: https://github.com/eclipse/jetty.project/issues/1502


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/c0181dd0
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/c0181dd0
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/c0181dd0

Branch: refs/heads/master
Commit: c0181dd0d41629997d37a6699e8c032ac17bec2a
Parents: 2bf0ba8
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Mon Apr 24 23:20:15 2017 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Mon Apr 24 23:22:21 2017 +0200

----------------------------------------------------------------------
 wicket-examples/src/main/webapp/WEB-INF/web.xml |  1 +
 .../ws/api/AbstractWebSocketProcessor.java      |  3 +-
 .../protocol/ws/api/BaseWebSocketBehavior.java  | 40 ++++++++++++++++++++
 .../ws/api/res/js/wicket-websocket-jquery.js    |  5 +++
 .../api/res/js/wicket-websocket-setup.js.tmpl   |  2 +-
 5 files changed, 48 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/c0181dd0/wicket-examples/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/webapp/WEB-INF/web.xml 
b/wicket-examples/src/main/webapp/WEB-INF/web.xml
index e23b1a1..97bef54 100644
--- a/wicket-examples/src/main/webapp/WEB-INF/web.xml
+++ b/wicket-examples/src/main/webapp/WEB-INF/web.xml
@@ -879,6 +879,7 @@
 
        <session-config>
                <session-timeout>5</session-timeout>
+        <!--<tracking-mode>URL</tracking-mode>-->
        </session-config>
 
 </web-app>

http://git-wip-us.apache.org/repos/asf/wicket/blob/c0181dd0/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
----------------------------------------------------------------------
diff --git 
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
index fc2945c..e546a23 100644
--- 
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
+++ 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java
@@ -102,9 +102,8 @@ public abstract class AbstractWebSocketProcessor implements 
IWebSocketProcessor
        public AbstractWebSocketProcessor(final HttpServletRequest request, 
final WebApplication application)
        {
                this.sessionId = request.getSession(true).getId();
-
                String pageId = request.getParameter("pageId");
-               resourceName = request.getParameter("resourceName");
+               this.resourceName = request.getParameter("resourceName");
                if (Strings.isEmpty(pageId) && Strings.isEmpty(resourceName))
                {
                        throw new IllegalArgumentException("The request should 
have either 'pageId' or 'resourceName' parameter!");

http://git-wip-us.apache.org/repos/asf/wicket/blob/c0181dd0/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/BaseWebSocketBehavior.java
----------------------------------------------------------------------
diff --git 
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/BaseWebSocketBehavior.java
 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/BaseWebSocketBehavior.java
index 7d1219f..37d615e 100644
--- 
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/BaseWebSocketBehavior.java
+++ 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/BaseWebSocketBehavior.java
@@ -16,18 +16,26 @@
  */
 package org.apache.wicket.protocol.ws.api;
 
+import org.apache.wicket.Application;
 import org.apache.wicket.Component;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
+import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.protocol.ws.WebSocketSettings;
+import org.apache.wicket.util.cookies.CookieUtils;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.lang.Generics;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.template.PackageTextTemplate;
 
 import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.SessionTrackingMode;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * A behavior that contributes {@link WicketWebSocketJQueryResourceReference}
@@ -81,6 +89,7 @@ public class BaseWebSocketBehavior extends Behavior
 
                Map<String, Object> variables = Generics.newHashMap();
 
+
                // set falsy JS values for the non-used parameter
                if (Strings.isEmpty(resourceName))
                {
@@ -111,6 +120,9 @@ public class BaseWebSocketBehavior extends Behavior
                Args.notNull(filterPrefix, "filterPrefix");
                variables.put("filterPrefix", filterPrefix);
 
+               final CharSequence sessionId = getSessionId(component);
+               variables.put("sessionId", sessionId);
+
                String webSocketSetupScript = 
webSocketSetupTemplate.asString(variables);
 
                
response.render(OnDomReadyHeaderItem.forScript(webSocketSetupScript));
@@ -128,6 +140,34 @@ public class BaseWebSocketBehavior extends Behavior
                return webSocketSettings.getBaseUrl();
        }
 
+       /**
+        * @param component
+        *          The component this behavior is bound to
+        * @return The http session id if it is tracked in the url, otherwise 
empty string
+        */
+       protected CharSequence getSessionId(final Component component)
+       {
+               String sessionId = "";
+               final WebApplication application = (WebApplication) 
component.getApplication();
+               final Set<SessionTrackingMode> effectiveSessionTrackingModes = 
application.getServletContext().getEffectiveSessionTrackingModes();
+               Object containerRequest = 
component.getRequest().getContainerRequest();
+               if (effectiveSessionTrackingModes.size() == 1 && 
SessionTrackingMode.URL.equals(effectiveSessionTrackingModes.iterator().next()))
+               {
+                       sessionId = component.getSession().getId();
+               }
+               else if (containerRequest instanceof HttpServletRequest)
+               {
+                       CookieUtils cookieUtils = new CookieUtils();
+                       final Cookie jsessionid = 
cookieUtils.getCookie("JSESSIONID");
+                       HttpServletRequest httpServletRequest = 
(HttpServletRequest) containerRequest;
+                       if (jsessionid == null || 
httpServletRequest.isRequestedSessionIdValid() == false)
+                       {
+                               sessionId = component.getSession().getId();
+                       }
+               }
+               return sessionId;
+       }
+
        @Override
        public boolean getStatelessHint(Component component)
        {

http://git-wip-us.apache.org/repos/asf/wicket/blob/c0181dd0/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-jquery.js
----------------------------------------------------------------------
diff --git 
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-jquery.js
 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-jquery.js
index 57cc1ad..3491d61 100644
--- 
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-jquery.js
+++ 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-jquery.js
@@ -58,6 +58,10 @@
 
                                url = protocol + '//' + document.location.host 
+ WWS.contextPath + WWS.filterPrefix + '/wicket/websocket';
 
+                               if (WWS.sessionId !== '') {
+                                       url += ';jsessionid=' + 
encodeURIComponent(WWS.sessionId);
+                               }
+
                                if (WWS.pageId !== false) {
                                        url += '?pageId=' + 
encodeURIComponent(WWS.pageId);
                                } else if (WWS.resourceName) {
@@ -66,6 +70,7 @@
 
                                url += '&wicket-ajax-baseurl=' + 
encodeURIComponent(WWS.baseUrl);
                                url += '&wicket-app-name=' + 
encodeURIComponent(WWS.appName);
+
                                self.ws = new WebSocket(url);
 
                                self.ws.onopen = function (evt) {

http://git-wip-us.apache.org/repos/asf/wicket/blob/c0181dd0/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-setup.js.tmpl
----------------------------------------------------------------------
diff --git 
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-setup.js.tmpl
 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-setup.js.tmpl
index 42c9693..a0d94d1 100644
--- 
a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-setup.js.tmpl
+++ 
b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-setup.js.tmpl
@@ -4,7 +4,7 @@
        if (typeof(Wicket.WebSocket.appName) === "undefined") {
                jQuery.extend(Wicket.WebSocket, { pageId: ${pageId}, 
resourceName: '${resourceName}',
                        baseUrl: '${baseUrl}', contextPath: '${contextPath}', 
appName: '${applicationName}',
-                       filterPrefix: '${filterPrefix}' });
+                       filterPrefix: '${filterPrefix}', sessionId: 
'${sessionId}' });
                Wicket.WebSocket.createDefaultConnection();
        }
 })();

Reply via email to