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.util.EventListener;
18
19 import javax.servlet.ServletException;
20 import javax.servlet.http.Cookie;
21 import javax.servlet.http.HttpServletRequest;
22 import javax.servlet.http.HttpServletResponse;
23 import javax.servlet.http.HttpSession;
24
25 import org.eclipse.jetty.http.HttpCookie;
26 import org.eclipse.jetty.server.DispatcherType;
27 import org.eclipse.jetty.server.HttpConnection;
28 import org.eclipse.jetty.server.Request;
29 import org.eclipse.jetty.server.Server;
30 import org.eclipse.jetty.server.SessionManager;
31 import org.eclipse.jetty.server.handler.HandlerWrapper;
32 import org.eclipse.jetty.util.log.Log;
33
34
35
36
37
38
39
40 public class SessionHandler extends HandlerWrapper
41 {
42
43 private SessionManager _sessionManager;
44
45
46
47
48
49
50 public SessionHandler()
51 {
52 this(new HashSessionManager());
53 }
54
55
56
57
58
59 public SessionHandler(SessionManager manager)
60 {
61 setSessionManager(manager);
62 }
63
64
65
66
67
68 public SessionManager getSessionManager()
69 {
70 return _sessionManager;
71 }
72
73
74
75
76
77 public void setSessionManager(SessionManager sessionManager)
78 {
79 if (isStarted())
80 throw new IllegalStateException();
81 SessionManager old_session_manager = _sessionManager;
82
83 if (getServer()!=null)
84 getServer().getContainer().update(this, old_session_manager, sessionManager, "sessionManager",true);
85
86 if (sessionManager!=null)
87 sessionManager.setSessionHandler(this);
88
89 _sessionManager = sessionManager;
90
91 if (old_session_manager!=null)
92 old_session_manager.setSessionHandler(null);
93 }
94
95
96
97 public void setServer(Server server)
98 {
99 Server old_server=getServer();
100 if (old_server!=null && old_server!=server)
101 old_server.getContainer().update(this, _sessionManager, null, "sessionManager",true);
102 super.setServer(server);
103 if (server!=null && server!=old_server)
104 server.getContainer().update(this, null,_sessionManager, "sessionManager",true);
105 }
106
107
108
109
110
111
112 protected void doStart() throws Exception
113 {
114 _sessionManager.start();
115 super.doStart();
116 }
117
118
119
120
121 protected void doStop() throws Exception
122 {
123 super.doStop();
124 _sessionManager.stop();
125 }
126
127
128
129
130
131 public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
132 throws IOException, ServletException
133 {
134 setRequestedId(baseRequest,request);
135
136 SessionManager old_session_manager=null;
137 HttpSession old_session=null;
138
139 try
140 {
141 old_session_manager = baseRequest.getSessionManager();
142 old_session = baseRequest.getSession(false);
143
144 if (old_session_manager != _sessionManager)
145 {
146
147 baseRequest.setSessionManager(_sessionManager);
148 baseRequest.setSession(null);
149 }
150
151
152 HttpSession session=null;
153 if (_sessionManager!=null)
154 {
155 session=baseRequest.getSession(false);
156 if (session!=null)
157 {
158 if(session!=old_session)
159 {
160 HttpCookie cookie = _sessionManager.access(session,request.isSecure());
161 if (cookie!=null )
162 baseRequest.getResponse().addCookie(cookie);
163 }
164 }
165 else
166 {
167 session=baseRequest.recoverNewSession(_sessionManager);
168 if (session!=null)
169 baseRequest.setSession(session);
170 }
171 }
172
173 if(Log.isDebugEnabled())
174 {
175 Log.debug("sessionManager="+_sessionManager);
176 Log.debug("session="+session);
177 }
178
179 getHandler().handle(target, baseRequest, request, response);
180 }
181 finally
182 {
183 HttpSession session=request.getSession(false);
184
185 if (old_session_manager != _sessionManager)
186 {
187
188 if (session!=null)
189 _sessionManager.complete(session);
190 baseRequest.setSessionManager(old_session_manager);
191 baseRequest.setSession(old_session);
192 }
193 }
194 }
195
196
197
198
199
200
201 protected void setRequestedId(Request baseRequest, HttpServletRequest request)
202 {
203 String requested_session_id=request.getRequestedSessionId();
204 if (!DispatcherType.REQUEST.equals(baseRequest.getDispatcherType()) || requested_session_id!=null)
205 return;
206
207 SessionManager sessionManager = getSessionManager();
208 boolean requested_session_id_from_cookie=false;
209 HttpSession session=null;
210
211
212 if (_sessionManager.isUsingCookies())
213 {
214 Cookie[] cookies=request.getCookies();
215 if (cookies!=null && cookies.length>0)
216 {
217 for (int i=0;i<cookies.length;i++)
218 {
219 if (sessionManager.getSessionCookie().equalsIgnoreCase(cookies[i].getName()))
220 {
221 if (requested_session_id!=null)
222 {
223
224
225
226 if (sessionManager.getHttpSession(requested_session_id)!=null)
227 break;
228 }
229
230 requested_session_id=cookies[i].getValue();
231 requested_session_id_from_cookie = true;
232 if(Log.isDebugEnabled())Log.debug("Got Session ID "+requested_session_id+" from cookie");
233
234 session=sessionManager.getHttpSession(requested_session_id);
235 if (session!=null)
236 baseRequest.setSession(session);
237 }
238 }
239 }
240 }
241
242 if (requested_session_id==null || session==null)
243 {
244 String uri = request.getRequestURI();
245
246 int semi = uri.lastIndexOf(';');
247 if (semi>=0)
248 {
249
250 String param=sessionManager.getSessionIdPathParameterName();
251 if (param!=null)
252 {
253 int p=uri.indexOf(param,semi+1);
254 if (p>0)
255 {
256 requested_session_id = uri.substring(p+param.length()+1);
257 requested_session_id_from_cookie = false;
258 if(Log.isDebugEnabled())Log.debug("Got Session ID "+requested_session_id+" from URL");
259 }
260 }
261 }
262 }
263
264 baseRequest.setRequestedSessionId(requested_session_id);
265 baseRequest.setRequestedSessionIdFromCookie(requested_session_id!=null && requested_session_id_from_cookie);
266 }
267
268
269
270
271
272 public void addEventListener(EventListener listener)
273 {
274 if(_sessionManager!=null)
275 _sessionManager.addEventListener(listener);
276 }
277
278
279 public void clearEventListeners()
280 {
281 if(_sessionManager!=null)
282 _sessionManager.clearEventListeners();
283 }
284 }