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