View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
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   * AbstractClientCrossContextSessionTest
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                  // Perform a request to contextA
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                  // Mangle the cookie, replacing Path with $Path, etc.
84                  sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
85  
86                  // Perform a request to contextB with the same session cookie
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             // Add something to the session
123             session.setAttribute("A", "A");
124 
125             // Check that we don't see things put in session by contextB
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             // Add something to the session
147             session.setAttribute("B", "B");
148 
149             // Check that we don't see things put in session by contextA
150             Object objectA = session.getAttribute("A");
151             assertTrue(objectA == null);
152         }
153     }
154 }