From 3c1f15174df96b18a8ce55b4ff18ac92ec87657b Mon Sep 17 00:00:00 2001 From: jfarcand Date: Tue, 27 Mar 2012 11:08:17 -0400 Subject: [PATCH] Fix for #242 Atmosphere&Jersey: Problem with using the session, Fix for #230 [runtime][jetty] Session lost on first request --- .../container/JettyWebSocketHandler.java | 2 +- .../org/atmosphere/cpr/AtmosphereRequest.java | 2 +- .../org/atmosphere/util/FakeHttpSession.java | 18 +++++++++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/modules/cpr/src/main/java/org/atmosphere/container/JettyWebSocketHandler.java b/modules/cpr/src/main/java/org/atmosphere/container/JettyWebSocketHandler.java index 1bb3a5a430b..d0193555661 100644 --- a/modules/cpr/src/main/java/org/atmosphere/container/JettyWebSocketHandler.java +++ b/modules/cpr/src/main/java/org/atmosphere/container/JettyWebSocketHandler.java @@ -223,7 +223,7 @@ public JettyRequestFix(AtmosphereRequest request) { this.serverPort = request.getServerPort(); HttpSession session = request.getSession(true); - httpSession = new FakeHttpSession(session.getId(), session.getServletContext(), session.getCreationTime()); + httpSession = new FakeHttpSession(session); Enumeration e = request.getHeaderNames(); String s; diff --git a/modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereRequest.java b/modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereRequest.java index e66e705618e..20a524aceef 100644 --- a/modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereRequest.java +++ b/modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereRequest.java @@ -76,7 +76,7 @@ public class AtmosphereRequest implements HttpServletRequest { private AtmosphereRequest(Builder b) { pathInfo = b.pathInfo == "" ? b.request.getPathInfo() : b.pathInfo; session = b.request == null ? - new FakeHttpSession("", null, System.currentTimeMillis()) : b.request.getSession(); + new FakeHttpSession("", null, System.currentTimeMillis(), -1) : b.request.getSession(); if (b.inputStream == null) { if (b.dataBytes != null) { diff --git a/modules/cpr/src/main/java/org/atmosphere/util/FakeHttpSession.java b/modules/cpr/src/main/java/org/atmosphere/util/FakeHttpSession.java index a37af0b8d44..656c311db3d 100644 --- a/modules/cpr/src/main/java/org/atmosphere/util/FakeHttpSession.java +++ b/modules/cpr/src/main/java/org/atmosphere/util/FakeHttpSession.java @@ -29,10 +29,16 @@ public class FakeHttpSession implements HttpSession { private final ServletContext servletContext; private int maxInactiveInterval; - public FakeHttpSession(String sessionId, ServletContext servletContext, long creationTime) { + public FakeHttpSession(String sessionId, ServletContext servletContext, long creationTime, int maxInactiveInterval) { this.sessionId = sessionId; this.servletContext = servletContext; this.creationTime = creationTime; + this.maxInactiveInterval = maxInactiveInterval; + } + + public FakeHttpSession(HttpSession session) { + this(session.getId(), session.getServletContext(), session.getLastAccessedTime(), session.getMaxInactiveInterval()); + copyAttributes(session); } public void destroy() { @@ -115,6 +121,16 @@ public void removeValue(String name) { attributes.remove(name); } + public FakeHttpSession copyAttributes(HttpSession httpSession){ + Enumeration e = httpSession.getAttributeNames(); + String k; + while(e.hasMoreElements()) { + k = e.nextElement(); + attributes.put(k, getAttribute(k)); + } + return this; + } + // TODO: Not supported for now. @Override public void invalidate() {