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