1
2
3
4
5
6
7
8
9
10
11
12
13 package org.eclipse.jetty.server.session;
14
15 import java.io.IOException;
16 import java.io.PrintWriter;
17 import java.util.Random;
18
19 import javax.servlet.ServletException;
20 import javax.servlet.http.HttpServlet;
21 import javax.servlet.http.HttpServletRequest;
22 import javax.servlet.http.HttpServletResponse;
23 import javax.servlet.http.HttpSession;
24
25 import org.eclipse.jetty.client.ContentExchange;
26 import org.eclipse.jetty.client.HttpClient;
27 import org.eclipse.jetty.http.HttpMethods;
28 import org.junit.Test;
29 import static org.junit.Assert.assertEquals;
30 import static org.junit.Assert.assertTrue;
31
32
33
34
35
36 public abstract class AbstractLastAccessTimeTest
37 {
38 public abstract AbstractTestServer createServer(int port, int max, int scavenge);
39
40 @Test
41 public void testLastAccessTime() throws Exception
42 {
43 String contextPath = "";
44 String servletMapping = "/server";
45 int maxInactivePeriod = 8;
46 int scavengePeriod = 2;
47 AbstractTestServer server1 = createServer(0, maxInactivePeriod, scavengePeriod);
48 server1.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
49 server1.start();
50 int port1=server1.getPort();
51 try
52 {
53 AbstractTestServer server2 = createServer(0, maxInactivePeriod, scavengePeriod);
54 server2.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
55 server2.start();
56 int port2=server2.getPort();
57 try
58 {
59 HttpClient client = new HttpClient();
60 client.setConnectorType(HttpClient.CONNECTOR_SOCKET);
61 client.start();
62 try
63 {
64
65 ContentExchange exchange1 = new ContentExchange(true);
66 exchange1.setMethod(HttpMethods.GET);
67 exchange1.setURL("http://localhost:" + port1 + contextPath + servletMapping + "?action=init");
68 client.send(exchange1);
69 exchange1.waitForDone();
70 assertEquals(HttpServletResponse.SC_OK, exchange1.getResponseStatus());
71 assertEquals("test", exchange1.getResponseContent());
72 String sessionCookie = exchange1.getResponseFields().getStringField("Set-Cookie");
73 assertTrue( sessionCookie != null );
74
75 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
76
77
78
79
80
81
82 int requestInterval = 500;
83 for (int i = 0; i < maxInactivePeriod * (1000 / requestInterval); ++i)
84 {
85 ContentExchange exchange2 = new ContentExchange(true);
86 exchange2.setMethod(HttpMethods.GET);
87 exchange2.setURL("http://localhost:" + port2 + contextPath + servletMapping);
88 exchange2.getRequestFields().add("Cookie", sessionCookie);
89 client.send(exchange2);
90 exchange2.waitForDone();
91 assertEquals(HttpServletResponse.SC_OK , exchange2.getResponseStatus());
92 assertEquals("test", exchange2.getResponseContent());
93
94 String setCookie = exchange1.getResponseFields().getStringField("Set-Cookie");
95 if (setCookie!=null)
96 sessionCookie = setCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
97
98 Thread.sleep(requestInterval);
99 }
100
101 System.out.println("Waiting for scavenging on node1...");
102
103
104
105 Thread.sleep(scavengePeriod * 2500L);
106
107
108 exchange1 = new ContentExchange(true);
109 exchange1.setMethod(HttpMethods.GET);
110 exchange1.setURL("http://localhost:" + port1 + contextPath + servletMapping);
111 exchange1.getRequestFields().add("Cookie", sessionCookie);
112 client.send(exchange1);
113 exchange1.waitForDone();
114 assertEquals(HttpServletResponse.SC_OK, exchange1.getResponseStatus());
115
116 }
117 finally
118 {
119 client.stop();
120 }
121 }
122 finally
123 {
124 server2.stop();
125 }
126 }
127 finally
128 {
129 server1.stop();
130 }
131 }
132
133 public static class TestServlet extends HttpServlet
134 {
135 @Override
136 protected void doGet(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException, IOException
137 {
138 String action = request.getParameter("action");
139 if ("init".equals(action))
140 {
141 HttpSession session = request.getSession(true);
142 session.setAttribute("test", "test");
143
144 sendResult(session, httpServletResponse.getWriter());
145
146 }
147 else
148 {
149 HttpSession session = request.getSession(false);
150
151
152 sendResult(session, httpServletResponse.getWriter());
153
154 if (session!=null)
155 {
156 session.setAttribute("test", "test");
157 }
158
159
160 }
161 }
162
163 private void sendResult(HttpSession session, PrintWriter writer)
164 {
165 if (session != null)
166 {
167 writer.print(session.getAttribute("test"));
168 }
169 else
170 {
171 writer.print("null");
172 }
173 }
174 }
175 }