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
48 AbstractTestServer server = createServer(0, -1, scavengePeriod);
49 server.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
50 server.start();
51 int port=server.getPort();
52
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(String.valueOf(value),response.trim());
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 if (session!=null)
118 result = (String)session.getAttribute("value");
119 }
120 PrintWriter writer = response.getWriter();
121 writer.println(result);
122 writer.flush();
123 }
124 }
125 }