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(); } })();
