1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.server.session;
20
21 import java.io.IOException;
22 import java.util.Collections;
23 import java.util.Random;
24
25 import javax.servlet.ServletException;
26 import javax.servlet.http.HttpServlet;
27 import javax.servlet.http.HttpServletRequest;
28 import javax.servlet.http.HttpServletResponse;
29 import javax.servlet.http.HttpSession;
30
31 import org.eclipse.jetty.client.ContentExchange;
32 import org.eclipse.jetty.client.HttpClient;
33 import org.eclipse.jetty.http.HttpMethods;
34 import org.eclipse.jetty.servlet.ServletContextHandler;
35 import org.eclipse.jetty.servlet.ServletHolder;
36 import org.junit.Test;
37 import static org.junit.Assert.assertEquals;
38 import static org.junit.Assert.assertTrue;
39
40
41
42
43
44 public abstract class AbstractClientCrossContextSessionTest
45 {
46
47 public abstract AbstractTestServer createServer(int port);
48
49 @Test
50 public void testCrossContextDispatch() throws Exception
51 {
52 String contextA = "/contextA";
53 String contextB = "/contextB";
54 String servletMapping = "/server";
55 AbstractTestServer server = createServer(0);
56 TestServletA servletA = new TestServletA();
57 ServletHolder holderA = new ServletHolder(servletA);
58 ServletContextHandler ctxA = server.addContext(contextA);
59 ctxA.addServlet(holderA, servletMapping);
60 ServletContextHandler ctxB = server.addContext(contextB);
61 TestServletB servletB = new TestServletB();
62 ServletHolder holderB = new ServletHolder(servletB);
63 ctxB.addServlet(holderB, servletMapping);
64 server.start();
65 int port = server.getPort();
66
67 try
68 {
69 HttpClient client = new HttpClient();
70 client.setConnectorType(HttpClient.CONNECTOR_SOCKET);
71 client.start();
72 try
73 {
74
75 ContentExchange exchangeA = new ContentExchange(true);
76 exchangeA.setMethod(HttpMethods.GET);
77 exchangeA.setURL("http://localhost:" + port + contextA + servletMapping);
78 client.send(exchangeA);
79 exchangeA.waitForDone();
80 assertEquals(HttpServletResponse.SC_OK,exchangeA.getResponseStatus());
81 String sessionCookie = exchangeA.getResponseFields().getStringField("Set-Cookie");
82 assertTrue(sessionCookie != null);
83
84 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
85
86
87 ContentExchange exchangeB = new ContentExchange(true);
88 exchangeB.setMethod(HttpMethods.GET);
89 exchangeB.setURL("http://localhost:" + port + contextB + servletMapping);
90 System.err.println("Cookie = "+sessionCookie);
91 exchangeB.getRequestFields().add("Cookie", sessionCookie);
92 client.send(exchangeB);
93 exchangeB.waitForDone();
94 assertEquals(HttpServletResponse.SC_OK,exchangeB.getResponseStatus());
95 assertEquals(servletA.sessionId, servletB.sessionId);
96 }
97 finally
98 {
99 client.stop();
100 }
101 }
102 finally
103 {
104 server.stop();
105 }
106 }
107
108 public static class TestServletA extends HttpServlet
109 {
110 public String sessionId;
111
112 @Override
113 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
114 {
115 HttpSession session = request.getSession(false);
116 if (session == null)
117 {
118 session = request.getSession(true);
119 sessionId = session.getId();
120 }
121
122
123 session.setAttribute("A", "A");
124
125
126 Object objectB = session.getAttribute("B");
127 assertTrue(objectB == null);
128 }
129 }
130
131 public static class TestServletB extends HttpServlet
132 {
133 public String sessionId;
134
135 @Override
136 protected void doGet(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException, IOException
137 {
138 HttpSession session = request.getSession(false);
139 if (session == null)
140 session = request.getSession(true);
141
142 sessionId = session.getId();
143
144
145
146
147 session.setAttribute("B", "B");
148
149
150 Object objectA = session.getAttribute("A");
151 assertTrue(objectA == null);
152 }
153 }
154 }