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