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 static org.junit.Assert.assertEquals;
22 import static org.junit.Assert.assertTrue;
23
24 import java.io.IOException;
25 import java.util.concurrent.TimeUnit;
26
27 import javax.servlet.ServletException;
28 import javax.servlet.http.HttpServlet;
29 import javax.servlet.http.HttpServletRequest;
30 import javax.servlet.http.HttpServletResponse;
31 import javax.servlet.http.HttpSession;
32
33 import org.eclipse.jetty.client.HttpClient;
34 import org.eclipse.jetty.client.api.ContentResponse;
35 import org.eclipse.jetty.client.api.Request;
36 import org.junit.Test;
37
38
39
40
41 public abstract class AbstractOrphanedSessionTest
42 {
43
44 public abstract AbstractTestServer createServer(int port, int max, int scavenge);
45
46
47
48
49
50 @Test
51 public void testOrphanedSession() throws Exception
52 {
53
54 String contextPath = "";
55 String servletMapping = "/server";
56 int inactivePeriod = 5;
57 AbstractTestServer server1 = createServer(0, inactivePeriod, -1);
58 server1.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
59 try
60 {
61 server1.start();
62 int port1 = server1.getPort();
63 int scavengePeriod = 2;
64 AbstractTestServer server2 = createServer(0, inactivePeriod, scavengePeriod);
65 server2.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
66 try
67 {
68 server2.start();
69 int port2 = server2.getPort();
70 HttpClient client = new HttpClient();
71 client.start();
72 try
73 {
74
75 ContentResponse response1 = client.GET("http://localhost:" + port1 + contextPath + servletMapping + "?action=init");
76 assertEquals(HttpServletResponse.SC_OK,response1.getStatus());
77 String sessionCookie = response1.getHeaders().getStringField("Set-Cookie");
78 assertTrue(sessionCookie != null);
79
80 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
81
82
83
84
85 Thread.sleep(TimeUnit.SECONDS.toMillis(inactivePeriod + 2L * scavengePeriod));
86
87
88 Request request = client.newRequest("http://localhost:" + port2 + contextPath + servletMapping + "?action=check");
89 request.header("Cookie", sessionCookie);
90 ContentResponse response2 = request.send();
91 assertEquals(HttpServletResponse.SC_OK,response2.getStatus());
92 }
93 finally
94 {
95 client.stop();
96 }
97 }
98 finally
99 {
100 server2.stop();
101 }
102 }
103 finally
104 {
105 server1.stop();
106 }
107 }
108
109 public static class TestServlet extends HttpServlet
110 {
111 @Override
112 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
113 {
114 String action = request.getParameter("action");
115 if ("init".equals(action))
116 {
117 HttpSession session = request.getSession(true);
118 session.setAttribute("A", "A");
119 }
120 else if ("remove".equals(action))
121 {
122 HttpSession session = request.getSession(false);
123 session.invalidate();
124
125 }
126 else if ("check".equals(action))
127 {
128 HttpSession session = request.getSession(false);
129 assertTrue(session == null);
130 }
131 }
132 }
133 }