Skip to content

Commit 6dc292e

Browse files
authored
Url session propagation (#13)
* Fix session id retrieval from URL * Fix integration test * Simplify http reply matcher * Remove perm size * Fix BUILD.md document * Add URL session propagation tests * Update dependency versions * Clarify session propagation usage.
1 parent 0e55dfc commit 6dc292e

19 files changed

Lines changed: 249 additions & 40 deletions

File tree

README.md

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,13 +228,30 @@ The first one is based on cookies and is the default one.
228228
The second one is based on URL rewriting where the session is appended at the
229229
end of the path part of URL (preceding the query).
230230

231+
The session propagation can be configured using web.xml (standard Servlet approach)
232+
233+
```xml
234+
<web-app>
235+
...
236+
<session-config>
237+
<tracking-mode>URL</tracking-mode>
238+
</session-config>
239+
</web-app>
240+
```
241+
It can also be configured using system property or servlet initialization parameter
242+
`com.amadeus.session.tracking`. Valid values are `COOKIE`, `URL` or `DEFAULT`
243+
(which is same as `COOKIE`).
244+
245+
The URL rewriting session propagation is not supported on Tomcat 6 based servlet
246+
engines (Tomcat 6.x, JBoss 6.x).
247+
231248
#### Cookie Session Management
232249

233250
The session is stored as a UUID inside a cookie.
234251
The cookie name is one of the following by descending order of priority:
235252

236-
* Using the `com.amadeus.session.cookieName` initialization parameter of the ServletContext.
237-
* Using the `com.amadeus.session.cookieName` system property.
253+
* Using the `com.amadeus.session.sessionName` initialization parameter of the ServletContext.
254+
* Using the `com.amadeus.session.sessionName` system property.
238255
* `JSESSIONID`.
239256

240257
In case of HTTPS requests, cookies can be marked as secure.

docs/BUILD.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ JVM with agent activated.
2828
Container testing is using arquillian framework. Same battery of tests can be run against
2929
several servlet containers. All tests are part of `session-replacement` project. In this
3030
project, coverage report can be activated using `coverage-per-test` profile.
31-
Following paragraphs describe testing in specific containers.
31+
Following paragraphs describe integration testing with specific containers.
3232

3333
#### Jetty 9
3434

@@ -45,7 +45,7 @@ The tests run on an embedded container.
4545
The testing is invoked using
4646

4747
```sh
48-
mvn verify -Ptomcat-7-arquillian,arquillian-tests
48+
mvn verify -Ptomcat-7-embedded-arquillian,arquillian-tests
4949
```
5050

5151
#### Wildfly 10
@@ -57,6 +57,10 @@ The testing is invoked using
5757
mvn verify -Pwildfly-10-managed-arquillian,arquillian-tests
5858
```
5959

60+
```sh
61+
mvn verify -Pwildfly-10-managed-arquillian-with-agent,external-arquillian-tests
62+
```
63+
6064
### Redis Tests
6165

6266
Redis tests require docker installation. This can be either native docker on Linux machines

docs/Usage.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ $JBOSS_HOME/bin/standalone.sh -mp $JBOSS_HOME/modules:$SESSION_PATH/modules
8585
# on Windows: $JBOSS_HOME\bin\standalone.ps1 -mp $JBOSS_HOME\modules;$SESSION_PATH\modules
8686
```
8787

88+
### URL session propagation
89+
90+
URL session propagation is _not_ supported in JBoss 6.x. It works in versions 7.x and in all Wildfly verions.
91+
8892
### Session replacement configuration in Wildfly/JBoss configuration file
8993

9094
TODO explain configuration using system properties in standalone.xml
@@ -162,8 +166,9 @@ manifested with class cast exceptions. It is recommended to give preference to t
162166
Tomcat 6.x supports Servlet 2.5 specification. This environment has few limitations and prerequisites:
163167

164168
* your web application must have at least one `Filter`, otherwise there will be no session replacement.
165-
* if you can modify your web application, add com.amadeus.session.servlet.SessionFilter as first filter of your web application.
169+
* if you can modify your web application, add `com.amadeus.session.servlet.SessionFilter` as first filter of your web application.
166170
* to support sending events to `HttpSessionListener` and `HttpSessionAttributeListener`, start the agent with `session=2.x` argument or set system property `com.amadeus.session.servlet.api=2.x`
171+
* URL session propagation is _not_ supported in Tomcat 6.x.
167172

168173
### Usage with Spring library
169174

integration-tests/arquillian-tests/src/test/container/wildfly10/standalone/configuration/standalone.xml

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,20 @@
9090
<named-formatter name="COLOR-PATTERN"/>
9191
</formatter>
9292
</console-handler>
93+
<async-handler name="ASYNC">
94+
<queue-length value="512"/>
95+
<overflow-action value="block"/>
96+
<subhandlers>
97+
<handler name="CONSOLE"/>
98+
</subhandlers>
99+
</async-handler>
100+
<async-handler name="ASYNC-FILE">
101+
<queue-length value="512"/>
102+
<overflow-action value="block"/>
103+
<subhandlers>
104+
<handler name="FILE"/>
105+
</subhandlers>
106+
</async-handler>
93107
<periodic-rotating-file-handler name="FILE" autoflush="true">
94108
<formatter>
95109
<named-formatter name="PATTERN"/>
@@ -108,10 +122,10 @@
108122
<level name="WARN"/>
109123
</logger>
110124
<root-logger>
111-
<level name="WARN"/>
125+
<level name="INFO"/>
112126
<handlers>
113-
<handler name="CONSOLE"/>
114-
<handler name="FILE"/>
127+
<handler name="ASYNC"/>
128+
<handler name="ASYNC-FILE"/>
115129
</handlers>
116130
</root-logger>
117131
<formatter name="PATTERN">

integration-tests/arquillian-tests/src/test/resources/arquillian.xml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,27 @@
77
<configuration>
88
<property name="user">arquillian</property>
99
<property name="pass">arquillian</property>
10-
<property name="javaVmArguments">-Xmx512m -XX:MaxPermSize=128m -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false</property>
10+
<property name="javaVmArguments">-Xmx512m -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false</property>
1111
</configuration>
1212
</container>
1313
<container qualifier="tomcat-6-managed-arquillian-with-agent">
1414
<configuration>
1515
<property name="user">arquillian</property>
1616
<property name="pass">arquillian</property>
17-
<property name="javaVmArguments">-Xmx512m -XX:MaxPermSize=128m -javaagent:${agent.location}=interceptListeners=true -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false</property>
17+
<property name="javaVmArguments">-Xmx512m -javaagent:${agent.location}=interceptListeners=true -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false</property>
1818
</configuration>
1919
</container>
2020
<container qualifier="tomcat-7-managed-arquillian-with-agent">
2121
<configuration>
2222
<property name="user">arquillian</property>
2323
<property name="pass">arquillian</property>
24-
<property name="javaVmArguments">-Xmx512m -XX:MaxPermSize=128m -javaagent:${agent.location}=interceptListeners=true -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false</property>
24+
<property name="javaVmArguments">-Xmx512m -javaagent:${agent.location}=interceptListeners=true -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false</property>
2525
</configuration>
2626
</container>
2727
<container qualifier="wildfly-10-managed-arquillian-with-agent">
2828
<configuration>
29-
<property name="javaVmArguments">-Xmx512m -XX:MaxPermSize=128m -javaagent:${agent.location}=interceptListeners=true</property>
29+
<!-- For debugging prepend with -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y -->
30+
<property name="javaVmArguments">-Xmx512m -javaagent:${agent.location}=interceptListeners=true</property>
3031
</configuration>
3132
</container>
3233
</arquillian>

session-replacement/pom.xml

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@
1010
<name>session-replacement</name>
1111
<description>Implementation of session management for JEE HttpSessions and general use case. Includes implemenations of in-memory and redis session distribution.</description>
1212
<properties>
13-
<redis.version>3.2.5</redis.version>
13+
<redis.version>3.2.8</redis.version>
1414
<redis.image>redis:${redis.version}-alpine</redis.image>
1515
<jedis.version>2.9.0</jedis.version>
16-
<slf4j.version>1.7.21</slf4j.version>
17-
<version.arquillian>1.1.11.Final</version.arquillian>
18-
<version.arquillian_jacoco>1.0.0.Alpha8</version.arquillian_jacoco>
19-
<version.jetty9>9.3.14.v20161028</version.jetty9>
20-
<version.tomcat7>7.0.73</version.tomcat7>
16+
<slf4j.version>1.7.25</slf4j.version>
17+
<version.arquillian>1.1.13.Final</version.arquillian>
18+
<version.arquillian_jacoco>1.0.0.Alpha9</version.arquillian_jacoco>
19+
<version.jetty9>9.3.18.v20170406</version.jetty9>
20+
<version.tomcat7>7.0.77</version.tomcat7>
2121
<version.wildfly>10.0.0.Final</version.wildfly>
2222
<sonar.exclusions>**/org/slf4j/impl/*.java</sonar.exclusions>
2323
</properties>
@@ -597,6 +597,11 @@
597597
<environmentVariables>
598598
<JBOSS_HOME>${project.build.directory}/wildfly-${version.wildfly}</JBOSS_HOME>
599599
</environmentVariables>
600+
<!--
601+
<systemPropertyVariables>
602+
<arquillian.launch>wildfly-10-managed-arquillian</arquillian.launch>
603+
</systemPropertyVariables>
604+
-->
600605
</configuration>
601606
</plugin>
602607
</plugins>

session-replacement/src/main/java/com/amadeus/session/SessionConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ public interface AttributeProvider {
243243
*
244244
* @see #DEFAULT_SESSION_ID_NAME
245245
*/
246-
public static final String SESSION_ID_NAME = "com.amadeus.session.cookieName";
246+
public static final String SESSION_ID_NAME = "com.amadeus.session.sessionName";
247247

248248
/**
249249
* Default name for the cookie or URL element.

session-replacement/src/main/java/com/amadeus/session/servlet/UrlSessionTracking.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ public void configure(SessionConfiguration configuration) {
3535

3636
@Override
3737
public String retrieveId(RequestWithSession request) {
38-
String pathInfo = ((HttpServletRequest)request).getPathInfo();
39-
int sessionIdStart = pathInfo.lastIndexOf(sessionIdPathItem);
38+
String requestUri = ((HttpServletRequest)request).getRequestURI();
39+
int sessionIdStart = requestUri.lastIndexOf(sessionIdPathItem);
4040
if (sessionIdStart > -1) {
4141
sessionIdStart += sessionIdPathItem.length();
42-
String sessionId = pathInfo.substring(sessionIdStart);
42+
String sessionId = requestUri.substring(sessionIdStart);
4343
return clean(sessionId);
4444
}
4545
return null;

session-replacement/src/test/java/com/amadeus/session/servlet/TestCookieSessionTracking.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void testRetrieveId() {
6060
HttpServletRequest hsr = (HttpServletRequest)request;
6161
UUID uuid = UUID.randomUUID();
6262
UUID uuidUrl = UUID.randomUUID();
63-
when(hsr.getPathInfo()).thenReturn(";somesession=" + uuidUrl);
63+
when(hsr.getRequestURI()).thenReturn("/url;somesession=" + uuidUrl);
6464
when(hsr.getCookies()).thenReturn(new Cookie[] { new Cookie("somesession", uuid.toString()) });
6565
assertEquals(uuid.toString(), cookieSessionTracking.retrieveId(request));
6666
when(hsr.getCookies()).thenReturn(new Cookie[] { new Cookie("notused", uuid.toString()) });

session-replacement/src/test/java/com/amadeus/session/servlet/TestUrlSessionTracking.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public void testRetrieveId() {
5959
RequestWithSession request = mock(RequestWithSession.class, withSettings().extraInterfaces(HttpServletRequest.class));
6060
HttpServletRequest hsr = (HttpServletRequest)request;
6161
UUID uuid = UUID.randomUUID();
62-
when(hsr.getPathInfo()).thenReturn(";somesession="+uuid);
62+
when(hsr.getRequestURI()).thenReturn("/url;somesession="+uuid);
6363
String id = urlSessionTracking.retrieveId(request);
6464
assertEquals(uuid.toString(), id);
6565
}
@@ -71,7 +71,7 @@ public void testBadId() {
7171
urlSessionTracking.configure(sc);
7272
RequestWithSession request = mock(RequestWithSession.class, withSettings().extraInterfaces(HttpServletRequest.class));
7373
HttpServletRequest hsr = (HttpServletRequest)request;
74-
when(hsr.getPathInfo()).thenReturn(";somesession=");
74+
when(hsr.getRequestURI()).thenReturn("/url;somesession=");
7575
String id = urlSessionTracking.retrieveId(request);
7676
assertNull(id);
7777
}

0 commit comments

Comments
 (0)