View Javadoc

1   // ========================================================================
2   // Copyright 2004-2005 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // Licensed under the Apache License, Version 2.0 (the "License");
5   // you may not use this file except in compliance with the License.
6   // You may obtain a copy of the License at
7   // http://www.apache.org/licenses/LICENSE-2.0
8   // Unless required by applicable law or agreed to in writing, software
9   // distributed under the License is distributed on an "AS IS" BASIS,
10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11  // See the License for the specific language governing permissions and
12  // limitations under the License.
13  // ========================================================================
14  
15  package org.mortbay.terracotta.servlet;
16  
17  import java.io.IOException;
18  import java.io.PrintWriter;
19  
20  import javax.servlet.ServletException;
21  import javax.servlet.http.HttpServlet;
22  import javax.servlet.http.HttpServletRequest;
23  import javax.servlet.http.HttpServletResponse;
24  import javax.servlet.http.HttpSession;
25  
26  import org.mortbay.jetty.HttpMethods;
27  import org.mortbay.jetty.client.ContentExchange;
28  import org.mortbay.jetty.client.HttpClient;
29  
30  /**
31   * @version $Revision: 1228 $ $Date: 2008-09-25 08:47:13 -0500 (Thu, 25 Sep 2008) $
32   */
33  public class SessionMigrationTest
34  {
35      public static void main(String[] args) throws Exception
36      {
37          new SessionMigrationTest().testSessionMigration();
38      }
39  
40      public void testSessionMigration() throws Exception
41      {
42          String contextPath = "";
43          String servletMapping = "/server";
44          int port1 = 8080;
45          TerracottaJettyServer server1 = new TerracottaJettyServer(port1);
46          server1.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
47          server1.start();
48          try
49          {
50              int port2 = 8181;
51              TerracottaJettyServer server2 = new TerracottaJettyServer(port2);
52              server2.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
53              server2.start();
54              try
55              {
56                  HttpClient client = new HttpClient();
57                  client.setConnectorType(HttpClient.CONNECTOR_SOCKET);
58                  client.start();
59                  try
60                  {
61                      // Perform one request to server1 to create a session
62                      int value = 1;
63                      ContentExchange exchange1 = new ContentExchange(true);
64                      exchange1.setMethod(HttpMethods.POST);
65                      exchange1.setURL("http://localhost:" + port1 + contextPath + servletMapping + "?action=set&value=" + value);
66                      client.send(exchange1);
67                      exchange1.waitForDone();
68                      assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK;
69                      String sessionCookie = exchange1.getResponseFields().getStringField("Set-Cookie");
70                      assert sessionCookie != null;
71  
72                      // Perform a request to server2 using the session cookie from the previous request
73                      // This should migrate the session from server1 to server2.
74                      ContentExchange exchange2 = new ContentExchange(true);
75                      exchange2.setMethod(HttpMethods.GET);
76                      exchange2.setURL("http://localhost:" + port2 + contextPath + servletMapping + "?action=get");
77                      exchange2.getRequestFields().add("Cookie", sessionCookie);
78                      client.send(exchange2);
79                      exchange2.waitForDone();
80                      assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK;
81                      String response = exchange2.getResponseContent();
82                      assert response.trim().equals(String.valueOf(value));
83                  }
84                  finally
85                  {
86                      client.stop();
87                  }
88              }
89              finally
90              {
91                  server2.stop();
92              }
93          }
94          finally
95          {
96              server1.stop();
97          }
98      }
99  
100     public static class TestServlet extends HttpServlet
101     {
102         @Override
103         protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
104         {
105             doPost(request, response);
106         }
107 
108         @Override
109         protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
110         {
111             HttpSession session = request.getSession(false);
112             if (session == null) session = request.getSession(true);
113 
114             String action = request.getParameter("action");
115             if ("set".equals(action))
116             {
117                 int value = Integer.parseInt(request.getParameter("value"));
118                 session.setAttribute("value", value);
119                 PrintWriter writer = response.getWriter();
120                 writer.println(value);
121                 writer.flush();
122             }
123             else if ("get".equals(action))
124             {
125                 int value = (Integer)session.getAttribute("value");
126                 PrintWriter writer = response.getWriter();
127                 writer.println(value);
128                 writer.flush();
129             }
130         }
131     }
132 }