Mercurial Hosting > luan
comparison src/org/eclipse/jetty/server/session/SessionHandler.java @ 802:3428c60d7cfc
replace jetty jars with source
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Wed, 07 Sep 2016 21:15:48 -0600 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 801:6a21393191c1 | 802:3428c60d7cfc |
|---|---|
| 1 // | |
| 2 // ======================================================================== | |
| 3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. | |
| 4 // ------------------------------------------------------------------------ | |
| 5 // All rights reserved. This program and the accompanying materials | |
| 6 // are made available under the terms of the Eclipse Public License v1.0 | |
| 7 // and Apache License v2.0 which accompanies this distribution. | |
| 8 // | |
| 9 // The Eclipse Public License is available at | |
| 10 // http://www.eclipse.org/legal/epl-v10.html | |
| 11 // | |
| 12 // The Apache License v2.0 is available at | |
| 13 // http://www.opensource.org/licenses/apache2.0.php | |
| 14 // | |
| 15 // You may elect to redistribute this code under either of these licenses. | |
| 16 // ======================================================================== | |
| 17 // | |
| 18 | |
| 19 package org.eclipse.jetty.server.session; | |
| 20 | |
| 21 import java.io.IOException; | |
| 22 import java.util.EnumSet; | |
| 23 import java.util.EventListener; | |
| 24 import javax.servlet.DispatcherType; | |
| 25 import javax.servlet.ServletException; | |
| 26 import javax.servlet.SessionTrackingMode; | |
| 27 import javax.servlet.http.Cookie; | |
| 28 import javax.servlet.http.HttpServletRequest; | |
| 29 import javax.servlet.http.HttpServletResponse; | |
| 30 import javax.servlet.http.HttpSession; | |
| 31 | |
| 32 import org.eclipse.jetty.http.HttpCookie; | |
| 33 import org.eclipse.jetty.server.Request; | |
| 34 import org.eclipse.jetty.server.Server; | |
| 35 import org.eclipse.jetty.server.SessionManager; | |
| 36 import org.eclipse.jetty.server.handler.ScopedHandler; | |
| 37 import org.eclipse.jetty.util.log.Log; | |
| 38 import org.eclipse.jetty.util.log.Logger; | |
| 39 | |
| 40 /* ------------------------------------------------------------ */ | |
| 41 /** | |
| 42 * SessionHandler. | |
| 43 */ | |
| 44 public class SessionHandler extends ScopedHandler | |
| 45 { | |
| 46 final static Logger LOG = Log.getLogger("org.eclipse.jetty.server.session"); | |
| 47 | |
| 48 public final static EnumSet<SessionTrackingMode> DEFAULT_TRACKING = EnumSet.of(SessionTrackingMode.COOKIE,SessionTrackingMode.URL); | |
| 49 | |
| 50 /* -------------------------------------------------------------- */ | |
| 51 private SessionManager _sessionManager; | |
| 52 | |
| 53 /* ------------------------------------------------------------ */ | |
| 54 /** | |
| 55 * Constructor. Construct a SessionHandler witha a HashSessionManager with a standard java.util.Random generator is created. | |
| 56 */ | |
| 57 public SessionHandler() | |
| 58 { | |
| 59 this(new HashSessionManager()); | |
| 60 } | |
| 61 | |
| 62 /* ------------------------------------------------------------ */ | |
| 63 /** | |
| 64 * @param manager | |
| 65 * The session manager | |
| 66 */ | |
| 67 public SessionHandler(SessionManager manager) | |
| 68 { | |
| 69 setSessionManager(manager); | |
| 70 } | |
| 71 | |
| 72 /* ------------------------------------------------------------ */ | |
| 73 /** | |
| 74 * @return Returns the sessionManager. | |
| 75 */ | |
| 76 public SessionManager getSessionManager() | |
| 77 { | |
| 78 return _sessionManager; | |
| 79 } | |
| 80 | |
| 81 /* ------------------------------------------------------------ */ | |
| 82 /** | |
| 83 * @param sessionManager | |
| 84 * The sessionManager to set. | |
| 85 */ | |
| 86 public void setSessionManager(SessionManager sessionManager) | |
| 87 { | |
| 88 if (isStarted()) | |
| 89 throw new IllegalStateException(); | |
| 90 SessionManager old_session_manager = _sessionManager; | |
| 91 | |
| 92 if (getServer() != null) | |
| 93 getServer().getContainer().update(this,old_session_manager,sessionManager,"sessionManager",true); | |
| 94 | |
| 95 if (sessionManager != null) | |
| 96 sessionManager.setSessionHandler(this); | |
| 97 | |
| 98 _sessionManager = sessionManager; | |
| 99 | |
| 100 if (old_session_manager != null) | |
| 101 old_session_manager.setSessionHandler(null); | |
| 102 } | |
| 103 | |
| 104 /* ------------------------------------------------------------ */ | |
| 105 @Override | |
| 106 public void setServer(Server server) | |
| 107 { | |
| 108 Server old_server = getServer(); | |
| 109 if (old_server != null && old_server != server) | |
| 110 old_server.getContainer().update(this,_sessionManager,null,"sessionManager",true); | |
| 111 super.setServer(server); | |
| 112 if (server != null && server != old_server) | |
| 113 server.getContainer().update(this,null,_sessionManager,"sessionManager",true); | |
| 114 } | |
| 115 | |
| 116 /* ------------------------------------------------------------ */ | |
| 117 /* | |
| 118 * @see org.eclipse.thread.AbstractLifeCycle#doStart() | |
| 119 */ | |
| 120 @Override | |
| 121 protected void doStart() throws Exception | |
| 122 { | |
| 123 _sessionManager.start(); | |
| 124 super.doStart(); | |
| 125 } | |
| 126 | |
| 127 /* ------------------------------------------------------------ */ | |
| 128 /* | |
| 129 * @see org.eclipse.thread.AbstractLifeCycle#doStop() | |
| 130 */ | |
| 131 @Override | |
| 132 protected void doStop() throws Exception | |
| 133 { | |
| 134 // Destroy sessions before destroying servlets/filters see JETTY-1266 | |
| 135 _sessionManager.stop(); | |
| 136 super.doStop(); | |
| 137 } | |
| 138 | |
| 139 /* ------------------------------------------------------------ */ | |
| 140 /* | |
| 141 * @see org.eclipse.jetty.server.Handler#handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, int) | |
| 142 */ | |
| 143 @Override | |
| 144 public void doScope(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException | |
| 145 { | |
| 146 SessionManager old_session_manager = null; | |
| 147 HttpSession old_session = null; | |
| 148 HttpSession access = null; | |
| 149 try | |
| 150 { | |
| 151 old_session_manager = baseRequest.getSessionManager(); | |
| 152 old_session = baseRequest.getSession(false); | |
| 153 | |
| 154 if (old_session_manager != _sessionManager) | |
| 155 { | |
| 156 // new session context | |
| 157 baseRequest.setSessionManager(_sessionManager); | |
| 158 baseRequest.setSession(null); | |
| 159 checkRequestedSessionId(baseRequest,request); | |
| 160 } | |
| 161 | |
| 162 // access any existing session | |
| 163 HttpSession session = null; | |
| 164 if (_sessionManager != null) | |
| 165 { | |
| 166 session = baseRequest.getSession(false); | |
| 167 if (session != null) | |
| 168 { | |
| 169 if (session != old_session) | |
| 170 { | |
| 171 access = session; | |
| 172 HttpCookie cookie = _sessionManager.access(session,request.isSecure()); | |
| 173 if (cookie != null) // Handle changed ID or max-age refresh | |
| 174 baseRequest.getResponse().addCookie(cookie); | |
| 175 } | |
| 176 } | |
| 177 else | |
| 178 { | |
| 179 session = baseRequest.recoverNewSession(_sessionManager); | |
| 180 if (session != null) | |
| 181 baseRequest.setSession(session); | |
| 182 } | |
| 183 } | |
| 184 | |
| 185 if (LOG.isDebugEnabled()) | |
| 186 { | |
| 187 LOG.debug("sessionManager=" + _sessionManager); | |
| 188 LOG.debug("session=" + session); | |
| 189 } | |
| 190 | |
| 191 // start manual inline of nextScope(target,baseRequest,request,response); | |
| 192 if (_nextScope != null) | |
| 193 _nextScope.doScope(target,baseRequest,request,response); | |
| 194 else if (_outerScope != null) | |
| 195 _outerScope.doHandle(target,baseRequest,request,response); | |
| 196 else | |
| 197 doHandle(target,baseRequest,request,response); | |
| 198 // end manual inline (pathentic attempt to reduce stack depth) | |
| 199 | |
| 200 } | |
| 201 finally | |
| 202 { | |
| 203 if (access != null) | |
| 204 _sessionManager.complete(access); | |
| 205 | |
| 206 HttpSession session = baseRequest.getSession(false); | |
| 207 if (session != null && old_session == null && session != access) | |
| 208 _sessionManager.complete(session); | |
| 209 | |
| 210 if (old_session_manager != null && old_session_manager != _sessionManager) | |
| 211 { | |
| 212 baseRequest.setSessionManager(old_session_manager); | |
| 213 baseRequest.setSession(old_session); | |
| 214 } | |
| 215 } | |
| 216 } | |
| 217 | |
| 218 /* ------------------------------------------------------------ */ | |
| 219 /* | |
| 220 * @see org.eclipse.jetty.server.Handler#handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, int) | |
| 221 */ | |
| 222 @Override | |
| 223 public void doHandle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException | |
| 224 { | |
| 225 // start manual inline of nextHandle(target,baseRequest,request,response); | |
| 226 if (never()) | |
| 227 nextHandle(target,baseRequest,request,response); | |
| 228 else if (_nextScope != null && _nextScope == _handler) | |
| 229 _nextScope.doHandle(target,baseRequest,request,response); | |
| 230 else if (_handler != null) | |
| 231 _handler.handle(target,baseRequest,request,response); | |
| 232 // end manual inline | |
| 233 } | |
| 234 | |
| 235 /* ------------------------------------------------------------ */ | |
| 236 /** | |
| 237 * Look for a requested session ID in cookies and URI parameters | |
| 238 * | |
| 239 * @param baseRequest | |
| 240 * @param request | |
| 241 */ | |
| 242 protected void checkRequestedSessionId(Request baseRequest, HttpServletRequest request) | |
| 243 { | |
| 244 String requested_session_id = request.getRequestedSessionId(); | |
| 245 | |
| 246 SessionManager sessionManager = getSessionManager(); | |
| 247 | |
| 248 if (requested_session_id != null && sessionManager != null) | |
| 249 { | |
| 250 HttpSession session = sessionManager.getHttpSession(requested_session_id); | |
| 251 if (session != null && sessionManager.isValid(session)) | |
| 252 baseRequest.setSession(session); | |
| 253 return; | |
| 254 } | |
| 255 else if (!DispatcherType.REQUEST.equals(baseRequest.getDispatcherType())) | |
| 256 return; | |
| 257 | |
| 258 boolean requested_session_id_from_cookie = false; | |
| 259 HttpSession session = null; | |
| 260 | |
| 261 // Look for session id cookie | |
| 262 if (_sessionManager.isUsingCookies()) | |
| 263 { | |
| 264 Cookie[] cookies = request.getCookies(); | |
| 265 if (cookies != null && cookies.length > 0) | |
| 266 { | |
| 267 final String sessionCookie=sessionManager.getSessionCookieConfig().getName(); | |
| 268 for (int i = 0; i < cookies.length; i++) | |
| 269 { | |
| 270 if (sessionCookie.equalsIgnoreCase(cookies[i].getName())) | |
| 271 { | |
| 272 requested_session_id = cookies[i].getValue(); | |
| 273 requested_session_id_from_cookie = true; | |
| 274 | |
| 275 LOG.debug("Got Session ID {} from cookie",requested_session_id); | |
| 276 | |
| 277 if (requested_session_id != null) | |
| 278 { | |
| 279 session = sessionManager.getHttpSession(requested_session_id); | |
| 280 | |
| 281 if (session != null && sessionManager.isValid(session)) | |
| 282 { | |
| 283 break; | |
| 284 } | |
| 285 } | |
| 286 else | |
| 287 { | |
| 288 LOG.warn("null session id from cookie"); | |
| 289 } | |
| 290 } | |
| 291 } | |
| 292 } | |
| 293 } | |
| 294 | |
| 295 if (requested_session_id == null || session == null) | |
| 296 { | |
| 297 String uri = request.getRequestURI(); | |
| 298 | |
| 299 String prefix = sessionManager.getSessionIdPathParameterNamePrefix(); | |
| 300 if (prefix != null) | |
| 301 { | |
| 302 int s = uri.indexOf(prefix); | |
| 303 if (s >= 0) | |
| 304 { | |
| 305 s += prefix.length(); | |
| 306 int i = s; | |
| 307 while (i < uri.length()) | |
| 308 { | |
| 309 char c = uri.charAt(i); | |
| 310 if (c == ';' || c == '#' || c == '?' || c == '/') | |
| 311 break; | |
| 312 i++; | |
| 313 } | |
| 314 | |
| 315 requested_session_id = uri.substring(s,i); | |
| 316 requested_session_id_from_cookie = false; | |
| 317 session = sessionManager.getHttpSession(requested_session_id); | |
| 318 if (LOG.isDebugEnabled()) | |
| 319 LOG.debug("Got Session ID {} from URL",requested_session_id); | |
| 320 } | |
| 321 } | |
| 322 } | |
| 323 | |
| 324 baseRequest.setRequestedSessionId(requested_session_id); | |
| 325 baseRequest.setRequestedSessionIdFromCookie(requested_session_id != null && requested_session_id_from_cookie); | |
| 326 if (session != null && sessionManager.isValid(session)) | |
| 327 baseRequest.setSession(session); | |
| 328 } | |
| 329 | |
| 330 /* ------------------------------------------------------------ */ | |
| 331 /** | |
| 332 * @param listener | |
| 333 */ | |
| 334 public void addEventListener(EventListener listener) | |
| 335 { | |
| 336 if (_sessionManager != null) | |
| 337 _sessionManager.addEventListener(listener); | |
| 338 } | |
| 339 | |
| 340 /* ------------------------------------------------------------ */ | |
| 341 public void clearEventListeners() | |
| 342 { | |
| 343 if (_sessionManager != null) | |
| 344 _sessionManager.clearEventListeners(); | |
| 345 } | |
| 346 } |
