View Javadoc

1   // ========================================================================
2   // Copyright 2004-2010 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // All rights reserved. This program and the accompanying materials
5   // are made available under the terms of the Eclipse Public License v1.0
6   // and Apache License v2.0 which accompanies this distribution.
7   // The Eclipse Public License is available at
8   // http://www.eclipse.org/legal/epl-v10.html
9   // The Apache License v2.0 is available at
10  // http://www.opensource.org/licenses/apache2.0.php
11  // You may elect to redistribute this code under either of these licenses.
12  // ========================================================================
13  package org.eclipse.jetty.server.session;
14  
15  import java.io.IOException;
16  import java.util.Random;
17  
18  import javax.servlet.ServletException;
19  import javax.servlet.http.HttpServlet;
20  import javax.servlet.http.HttpServletRequest;
21  import javax.servlet.http.HttpServletResponse;
22  import javax.servlet.http.HttpSession;
23  
24  import org.eclipse.jetty.client.ContentExchange;
25  import org.eclipse.jetty.client.HttpClient;
26  import org.eclipse.jetty.http.HttpMethods;
27  import org.eclipse.jetty.server.Request;
28  import org.eclipse.jetty.server.SessionManager;
29  import org.junit.Test;
30  import static org.junit.Assert.assertEquals;
31  import static org.junit.Assert.assertTrue;
32  
33  /**
34   * AbstractLocalSessionScavengingTest
35   */
36  public abstract class AbstractLocalSessionScavengingTest
37  {
38      public abstract AbstractTestServer createServer(int port, int max, int scavenge);
39  
40      public void pause(int scavengePeriod)
41      {
42          try
43          {
44              Thread.sleep(scavengePeriod * 2500L);
45          }
46          catch (InterruptedException e)
47          {
48              e.printStackTrace();
49          }
50      }
51      
52      @Test
53      public void testLocalSessionsScavenging() throws Exception
54      {
55          String contextPath = "";
56          String servletMapping = "/server";
57          int inactivePeriod = 1;
58          int scavengePeriod = 2;
59          AbstractTestServer server1 = createServer(0, inactivePeriod, scavengePeriod);
60          server1.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
61          server1.start();
62          int port1 = server1.getPort();
63          try
64          {
65              AbstractTestServer server2 = createServer(0, inactivePeriod, scavengePeriod * 3);
66              server2.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
67              server2.start();
68              int port2 = server2.getPort();
69              try
70              {
71                  HttpClient client = new HttpClient();
72                  client.setConnectorType(HttpClient.CONNECTOR_SOCKET);
73                  client.start();
74                  try
75                  {
76                      String[] urls = new String[2];
77                      urls[0] = "http://localhost:" + port1 + contextPath + servletMapping;
78                      urls[1] = "http://localhost:" + port2 + contextPath + servletMapping;
79  
80                      // Create the session on node1
81                      ContentExchange exchange1 = new ContentExchange(true);
82                      exchange1.setMethod(HttpMethods.GET);
83                      exchange1.setURL(urls[0] + "?action=init");
84                      client.send(exchange1);
85                      exchange1.waitForDone();
86                      assertEquals(HttpServletResponse.SC_OK,exchange1.getResponseStatus());
87                      String sessionCookie = exchange1.getResponseFields().getStringField("Set-Cookie");
88                      assertTrue(sessionCookie != null);
89                      // Mangle the cookie, replacing Path with $Path, etc.
90                      sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
91  
92                      // Be sure the session is also present in node2
93                      ContentExchange exchange2 = new ContentExchange(true);
94                      exchange2.setMethod(HttpMethods.GET);
95                      exchange2.setURL(urls[1] + "?action=test");
96                      exchange2.getRequestFields().add("Cookie", sessionCookie);
97                      client.send(exchange2);
98                      exchange2.waitForDone();
99                      assertEquals(HttpServletResponse.SC_OK,exchange2.getResponseStatus());
100                     
101                     
102                     // Wait for the scavenger to run on node1, waiting 2.5 times the scavenger period
103                     pause(scavengePeriod);
104                     
105                     // Check that node1 does not have any local session cached
106                     exchange1 = new ContentExchange(true);
107                     exchange1.setMethod(HttpMethods.GET);
108                     exchange1.setURL(urls[0] + "?action=check");
109                     client.send(exchange1);
110                     exchange1.waitForDone();
111                     assertEquals(HttpServletResponse.SC_OK,exchange1.getResponseStatus());
112 
113 
114                     // Wait for the scavenger to run on node2, waiting 2 times the scavenger period
115                     // This ensures that the scavenger on node2 runs at least once.
116                     pause(scavengePeriod);
117 
118                     // Check that node2 does not have any local session cached   
119                     exchange2 = new ContentExchange(true);
120                     exchange2.setMethod(HttpMethods.GET);
121                     exchange2.setURL(urls[1] + "?action=check");
122                     client.send(exchange2);
123                     exchange2.waitForDone();
124                     assertEquals(HttpServletResponse.SC_OK,exchange2.getResponseStatus());
125                 }
126                 finally
127                 {
128                     client.stop();
129                 }
130             }
131             finally
132             {
133                 server2.stop();
134             }
135         }
136         finally
137         {
138             server1.stop();
139         }
140     }
141 
142     public static class TestServlet extends HttpServlet
143     {
144         private SessionManager sessionManager;
145 
146         @Override
147         protected void doGet(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException, IOException
148         {
149             String action = request.getParameter("action");
150             if ("init".equals(action))
151             {
152                 HttpSession session = request.getSession(true);
153                 session.setAttribute("test", "test");
154                 this.sessionManager = ((Request)request).getSessionManager();
155             }
156             else if ("test".equals(action))
157             {
158                 HttpSession session = request.getSession(false);
159                 session.setAttribute("test", "test");
160                 this.sessionManager = ((Request)request).getSessionManager();
161             }
162             else if ("check".equals(action))
163             {
164                 HttpSession session = request.getSession(false);
165                 assertTrue(session == null);
166             }
167         }
168     }
169 }