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 String contextPath = "";
45 String servletMapping = "/server";
46 int scavengePeriod = 2;
47 AbstractTestServer server = createServer(0, -1, scavengePeriod);
48 server.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
49 server.start();
50 int port=server.getPort();
51
52 try
53 {
54 HttpClient client = new HttpClient();
55 client.setConnectorType(HttpClient.CONNECTOR_SOCKET);
56 client.start();
57 try
58 {
59 int value = 42;
60 ContentExchange exchange = new ContentExchange(true);
61 exchange.setMethod(HttpMethods.GET);
62 exchange.setURL("http://localhost:" + port + contextPath + servletMapping + "?action=set&value=" + value);
63 client.send(exchange);
64 exchange.waitForDone();
65 assertEquals(HttpServletResponse.SC_OK,exchange.getResponseStatus());
66 String sessionCookie = exchange.getResponseFields().getStringField("Set-Cookie");
67 assertTrue(sessionCookie != null);
68
69 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
70
71 String response = exchange.getResponseContent();
72 assertEquals(response.trim(),String.valueOf(value));
73
74
75 Thread.sleep(scavengePeriod * 2500L);
76
77
78 exchange = new ContentExchange(true);
79 exchange.setMethod(HttpMethods.GET);
80 exchange.setURL("http://localhost:" + port + contextPath + servletMapping + "?action=get");
81 exchange.getRequestFields().add("Cookie", sessionCookie);
82 client.send(exchange);
83 exchange.waitForDone();
84 assertEquals(HttpServletResponse.SC_OK,exchange.getResponseStatus());
85 response = exchange.getResponseContent();
86 assertEquals(response.trim(),String.valueOf(value));
87 }
88 finally
89 {
90 client.stop();
91 }
92 }
93 finally
94 {
95 server.stop();
96 }
97 }
98
99 public static class TestServlet extends HttpServlet
100 {
101 @Override
102 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
103 {
104 String result = null;
105 String action = request.getParameter("action");
106 if ("set".equals(action))
107 {
108 String value = request.getParameter("value");
109 HttpSession session = request.getSession(true);
110 session.setAttribute("value", value);
111 result = value;
112 }
113 else if ("get".equals(action))
114 {
115 HttpSession session = request.getSession(false);
116 result = (String)session.getAttribute("value");
117 }
118 PrintWriter writer = response.getWriter();
119 writer.println(result);
120 writer.flush();
121 }
122 }
123 }