1
2
3
4
5
6
7
8
9
10
11
12
13
14 package org.eclipse.jetty.server.session;
15
16 import java.io.IOException;
17 import java.io.PrintWriter;
18 import java.util.Random;
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.eclipse.jetty.client.ContentExchange;
27 import org.eclipse.jetty.client.HttpClient;
28 import org.eclipse.jetty.http.HttpMethods;
29 import org.junit.Test;
30
31
32
33
34
35 public abstract class AbstractImmortalSessionTest
36 {
37 public abstract AbstractTestServer createServer(int port, int maxInactiveMs, int scavengeMs);
38
39 @Test
40 public void testImmortalSession() throws Exception
41 {
42 Random random = new Random(System.nanoTime());
43
44 String contextPath = "";
45 String servletMapping = "/server";
46 int port = random.nextInt(50000) + 10000;
47 int scavengePeriod = 2;
48 AbstractTestServer server = createServer(port, -1, scavengePeriod);
49 server.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
50 server.start();
51 try
52 {
53 HttpClient client = new HttpClient();
54 client.setConnectorType(HttpClient.CONNECTOR_SOCKET);
55 client.start();
56 try
57 {
58 int value = 42;
59 ContentExchange exchange = new ContentExchange(true);
60 exchange.setMethod(HttpMethods.GET);
61 exchange.setURL("http://localhost:" + port + contextPath + servletMapping + "?action=set&value=" + value);
62 client.send(exchange);
63 exchange.waitForDone();
64 assert exchange.getResponseStatus() == HttpServletResponse.SC_OK;
65 String sessionCookie = exchange.getResponseFields().getStringField("Set-Cookie");
66 assert sessionCookie != null;
67
68 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
69
70 String response = exchange.getResponseContent();
71 assert response.trim().equals(String.valueOf(value));
72
73
74 Thread.sleep(scavengePeriod * 2500L);
75
76
77 exchange = new ContentExchange(true);
78 exchange.setMethod(HttpMethods.GET);
79 exchange.setURL("http://localhost:" + port + contextPath + servletMapping + "?action=get");
80 exchange.getRequestFields().add("Cookie", sessionCookie);
81 client.send(exchange);
82 exchange.waitForDone();
83 assert exchange.getResponseStatus() == HttpServletResponse.SC_OK;
84 response = exchange.getResponseContent();
85 assert response.trim().equals(String.valueOf(value));
86 }
87 finally
88 {
89 client.stop();
90 }
91 }
92 finally
93 {
94 server.stop();
95 }
96 }
97
98 public static class TestServlet extends HttpServlet
99 {
100 @Override
101 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
102 {
103 String result = null;
104 String action = request.getParameter("action");
105 if ("set".equals(action))
106 {
107 String value = request.getParameter("value");
108 HttpSession session = request.getSession(true);
109 session.setAttribute("value", value);
110 result = value;
111 }
112 else if ("get".equals(action))
113 {
114 HttpSession session = request.getSession(false);
115 result = (String)session.getAttribute("value");
116 }
117 PrintWriter writer = response.getWriter();
118 writer.println(result);
119 writer.flush();
120 }
121 }
122 }