103928aee4356845252ac6b662d5c72c29903813eJake Slack// 203928aee4356845252ac6b662d5c72c29903813eJake Slack// ======================================================================== 303928aee4356845252ac6b662d5c72c29903813eJake Slack// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. 403928aee4356845252ac6b662d5c72c29903813eJake Slack// ------------------------------------------------------------------------ 503928aee4356845252ac6b662d5c72c29903813eJake Slack// All rights reserved. This program and the accompanying materials 603928aee4356845252ac6b662d5c72c29903813eJake Slack// are made available under the terms of the Eclipse Public License v1.0 703928aee4356845252ac6b662d5c72c29903813eJake Slack// and Apache License v2.0 which accompanies this distribution. 803928aee4356845252ac6b662d5c72c29903813eJake Slack// 903928aee4356845252ac6b662d5c72c29903813eJake Slack// The Eclipse Public License is available at 1003928aee4356845252ac6b662d5c72c29903813eJake Slack// http://www.eclipse.org/legal/epl-v10.html 1103928aee4356845252ac6b662d5c72c29903813eJake Slack// 1203928aee4356845252ac6b662d5c72c29903813eJake Slack// The Apache License v2.0 is available at 1303928aee4356845252ac6b662d5c72c29903813eJake Slack// http://www.opensource.org/licenses/apache2.0.php 1403928aee4356845252ac6b662d5c72c29903813eJake Slack// 1503928aee4356845252ac6b662d5c72c29903813eJake Slack// You may elect to redistribute this code under either of these licenses. 1603928aee4356845252ac6b662d5c72c29903813eJake Slack// ======================================================================== 1703928aee4356845252ac6b662d5c72c29903813eJake Slack// 1803928aee4356845252ac6b662d5c72c29903813eJake Slack 1903928aee4356845252ac6b662d5c72c29903813eJake Slackpackage org.eclipse.jetty.server.session; 2003928aee4356845252ac6b662d5c72c29903813eJake Slack 2103928aee4356845252ac6b662d5c72c29903813eJake Slackimport static java.lang.Math.round; 2203928aee4356845252ac6b662d5c72c29903813eJake Slack 2303928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Arrays; 2403928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Collections; 2503928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Enumeration; 2603928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.EventListener; 2703928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.HashSet; 2803928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.HashMap; 2903928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.List; 3003928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Map; 3103928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Set; 3203928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.concurrent.CopyOnWriteArrayList; 3303928aee4356845252ac6b662d5c72c29903813eJake Slack 3403928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.ServletRequest; 3503928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.SessionCookieConfig; 3603928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.SessionTrackingMode; 3703928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpServletRequest; 3803928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpSession; 3903928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpSessionAttributeListener; 4003928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpSessionBindingEvent; 4103928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpSessionContext; 4203928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpSessionEvent; 4303928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpSessionListener; 4403928aee4356845252ac6b662d5c72c29903813eJake Slack 4503928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpCookie; 4603928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.server.AbstractConnector; 4703928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.server.Request; 4803928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.server.Server; 4903928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.server.SessionIdManager; 5003928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.server.SessionManager; 5103928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.server.handler.ContextHandler; 5203928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.component.AbstractLifeCycle; 5303928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.log.Logger; 5403928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.statistic.CounterStatistic; 5503928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.statistic.SampleStatistic; 5603928aee4356845252ac6b662d5c72c29903813eJake Slack 5703928aee4356845252ac6b662d5c72c29903813eJake Slack/* ------------------------------------------------------------ */ 5803928aee4356845252ac6b662d5c72c29903813eJake Slack/** 5903928aee4356845252ac6b662d5c72c29903813eJake Slack * An Abstract implementation of SessionManager. The partial implementation of 6003928aee4356845252ac6b662d5c72c29903813eJake Slack * SessionManager interface provides the majority of the handling required to 6103928aee4356845252ac6b662d5c72c29903813eJake Slack * implement a SessionManager. Concrete implementations of SessionManager based 6203928aee4356845252ac6b662d5c72c29903813eJake Slack * on AbstractSessionManager need only implement the newSession method to return 6303928aee4356845252ac6b662d5c72c29903813eJake Slack * a specialised version of the Session inner class that provides an attribute 6403928aee4356845252ac6b662d5c72c29903813eJake Slack * Map. 6503928aee4356845252ac6b662d5c72c29903813eJake Slack * <p> 6603928aee4356845252ac6b662d5c72c29903813eJake Slack */ 6703928aee4356845252ac6b662d5c72c29903813eJake Slack@SuppressWarnings("deprecation") 6803928aee4356845252ac6b662d5c72c29903813eJake Slackpublic abstract class AbstractSessionManager extends AbstractLifeCycle implements SessionManager 6903928aee4356845252ac6b662d5c72c29903813eJake Slack{ 7003928aee4356845252ac6b662d5c72c29903813eJake Slack final static Logger __log = SessionHandler.LOG; 7103928aee4356845252ac6b662d5c72c29903813eJake Slack 7203928aee4356845252ac6b662d5c72c29903813eJake Slack public Set<SessionTrackingMode> __defaultSessionTrackingModes = 7303928aee4356845252ac6b662d5c72c29903813eJake Slack Collections.unmodifiableSet( 7403928aee4356845252ac6b662d5c72c29903813eJake Slack new HashSet<SessionTrackingMode>( 7503928aee4356845252ac6b662d5c72c29903813eJake Slack Arrays.asList(new SessionTrackingMode[]{SessionTrackingMode.COOKIE,SessionTrackingMode.URL}))); 7603928aee4356845252ac6b662d5c72c29903813eJake Slack 7703928aee4356845252ac6b662d5c72c29903813eJake Slack public final static String SESSION_KNOWN_ONLY_TO_AUTHENTICATED="org.eclipse.jetty.security.sessionKnownOnlytoAuthenticated"; 7803928aee4356845252ac6b662d5c72c29903813eJake Slack 7903928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 8003928aee4356845252ac6b662d5c72c29903813eJake Slack public final static int __distantFuture=60*60*24*7*52*20; 8103928aee4356845252ac6b662d5c72c29903813eJake Slack 8203928aee4356845252ac6b662d5c72c29903813eJake Slack static final HttpSessionContext __nullSessionContext=new HttpSessionContext() 8303928aee4356845252ac6b662d5c72c29903813eJake Slack { 8403928aee4356845252ac6b662d5c72c29903813eJake Slack public HttpSession getSession(String sessionId) 8503928aee4356845252ac6b662d5c72c29903813eJake Slack { 8603928aee4356845252ac6b662d5c72c29903813eJake Slack return null; 8703928aee4356845252ac6b662d5c72c29903813eJake Slack } 8803928aee4356845252ac6b662d5c72c29903813eJake Slack 8903928aee4356845252ac6b662d5c72c29903813eJake Slack @SuppressWarnings({ "rawtypes", "unchecked" }) 9003928aee4356845252ac6b662d5c72c29903813eJake Slack public Enumeration getIds() 9103928aee4356845252ac6b662d5c72c29903813eJake Slack { 9203928aee4356845252ac6b662d5c72c29903813eJake Slack return Collections.enumeration(Collections.EMPTY_LIST); 9303928aee4356845252ac6b662d5c72c29903813eJake Slack } 9403928aee4356845252ac6b662d5c72c29903813eJake Slack }; 9503928aee4356845252ac6b662d5c72c29903813eJake Slack 9603928aee4356845252ac6b662d5c72c29903813eJake Slack private boolean _usingCookies=true; 9703928aee4356845252ac6b662d5c72c29903813eJake Slack 9803928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 9903928aee4356845252ac6b662d5c72c29903813eJake Slack // Setting of max inactive interval for new sessions 10003928aee4356845252ac6b662d5c72c29903813eJake Slack // -1 means no timeout 10103928aee4356845252ac6b662d5c72c29903813eJake Slack protected int _dftMaxIdleSecs=-1; 10203928aee4356845252ac6b662d5c72c29903813eJake Slack protected SessionHandler _sessionHandler; 10303928aee4356845252ac6b662d5c72c29903813eJake Slack protected boolean _httpOnly=false; 10403928aee4356845252ac6b662d5c72c29903813eJake Slack protected SessionIdManager _sessionIdManager; 10503928aee4356845252ac6b662d5c72c29903813eJake Slack protected boolean _secureCookies=false; 10603928aee4356845252ac6b662d5c72c29903813eJake Slack protected boolean _secureRequestOnly=true; 10703928aee4356845252ac6b662d5c72c29903813eJake Slack 10803928aee4356845252ac6b662d5c72c29903813eJake Slack protected final List<HttpSessionAttributeListener> _sessionAttributeListeners = new CopyOnWriteArrayList<HttpSessionAttributeListener>(); 10903928aee4356845252ac6b662d5c72c29903813eJake Slack protected final List<HttpSessionListener> _sessionListeners= new CopyOnWriteArrayList<HttpSessionListener>(); 11003928aee4356845252ac6b662d5c72c29903813eJake Slack 11103928aee4356845252ac6b662d5c72c29903813eJake Slack protected ClassLoader _loader; 11203928aee4356845252ac6b662d5c72c29903813eJake Slack protected ContextHandler.Context _context; 11303928aee4356845252ac6b662d5c72c29903813eJake Slack protected String _sessionCookie=__DefaultSessionCookie; 11403928aee4356845252ac6b662d5c72c29903813eJake Slack protected String _sessionIdPathParameterName = __DefaultSessionIdPathParameterName; 11503928aee4356845252ac6b662d5c72c29903813eJake Slack protected String _sessionIdPathParameterNamePrefix =";"+ _sessionIdPathParameterName +"="; 11603928aee4356845252ac6b662d5c72c29903813eJake Slack protected String _sessionDomain; 11703928aee4356845252ac6b662d5c72c29903813eJake Slack protected String _sessionPath; 11803928aee4356845252ac6b662d5c72c29903813eJake Slack protected int _maxCookieAge=-1; 11903928aee4356845252ac6b662d5c72c29903813eJake Slack protected int _refreshCookieAge; 12003928aee4356845252ac6b662d5c72c29903813eJake Slack protected boolean _nodeIdInSessionId; 12103928aee4356845252ac6b662d5c72c29903813eJake Slack protected boolean _checkingRemoteSessionIdEncoding; 12203928aee4356845252ac6b662d5c72c29903813eJake Slack protected String _sessionComment; 12303928aee4356845252ac6b662d5c72c29903813eJake Slack 12403928aee4356845252ac6b662d5c72c29903813eJake Slack public Set<SessionTrackingMode> _sessionTrackingModes; 12503928aee4356845252ac6b662d5c72c29903813eJake Slack 12603928aee4356845252ac6b662d5c72c29903813eJake Slack private boolean _usingURLs; 12703928aee4356845252ac6b662d5c72c29903813eJake Slack 12803928aee4356845252ac6b662d5c72c29903813eJake Slack protected final CounterStatistic _sessionsStats = new CounterStatistic(); 12903928aee4356845252ac6b662d5c72c29903813eJake Slack protected final SampleStatistic _sessionTimeStats = new SampleStatistic(); 13003928aee4356845252ac6b662d5c72c29903813eJake Slack 13103928aee4356845252ac6b662d5c72c29903813eJake Slack 13203928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 13303928aee4356845252ac6b662d5c72c29903813eJake Slack public static HttpSession renewSession (HttpServletRequest request, HttpSession httpSession, boolean authenticated) 13403928aee4356845252ac6b662d5c72c29903813eJake Slack { 13503928aee4356845252ac6b662d5c72c29903813eJake Slack Map<String,Object> attributes = new HashMap<String, Object>(); 13603928aee4356845252ac6b662d5c72c29903813eJake Slack 13703928aee4356845252ac6b662d5c72c29903813eJake Slack for (Enumeration<String> e=httpSession.getAttributeNames();e.hasMoreElements();) 13803928aee4356845252ac6b662d5c72c29903813eJake Slack { 13903928aee4356845252ac6b662d5c72c29903813eJake Slack String name=e.nextElement(); 14003928aee4356845252ac6b662d5c72c29903813eJake Slack attributes.put(name,httpSession.getAttribute(name)); 14103928aee4356845252ac6b662d5c72c29903813eJake Slack httpSession.removeAttribute(name); 14203928aee4356845252ac6b662d5c72c29903813eJake Slack } 14303928aee4356845252ac6b662d5c72c29903813eJake Slack 14403928aee4356845252ac6b662d5c72c29903813eJake Slack httpSession.invalidate(); 14503928aee4356845252ac6b662d5c72c29903813eJake Slack httpSession = request.getSession(true); 14603928aee4356845252ac6b662d5c72c29903813eJake Slack if (authenticated) 14703928aee4356845252ac6b662d5c72c29903813eJake Slack httpSession.setAttribute(SESSION_KNOWN_ONLY_TO_AUTHENTICATED, Boolean.TRUE); 14803928aee4356845252ac6b662d5c72c29903813eJake Slack for (Map.Entry<String, Object> entry: attributes.entrySet()) 14903928aee4356845252ac6b662d5c72c29903813eJake Slack httpSession.setAttribute(entry.getKey(),entry.getValue()); 15003928aee4356845252ac6b662d5c72c29903813eJake Slack return httpSession; 15103928aee4356845252ac6b662d5c72c29903813eJake Slack } 15203928aee4356845252ac6b662d5c72c29903813eJake Slack 15303928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 15403928aee4356845252ac6b662d5c72c29903813eJake Slack public AbstractSessionManager() 15503928aee4356845252ac6b662d5c72c29903813eJake Slack { 15603928aee4356845252ac6b662d5c72c29903813eJake Slack setSessionTrackingModes(__defaultSessionTrackingModes); 15703928aee4356845252ac6b662d5c72c29903813eJake Slack } 15803928aee4356845252ac6b662d5c72c29903813eJake Slack 15903928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 16003928aee4356845252ac6b662d5c72c29903813eJake Slack public ContextHandler.Context getContext() 16103928aee4356845252ac6b662d5c72c29903813eJake Slack { 16203928aee4356845252ac6b662d5c72c29903813eJake Slack return _context; 16303928aee4356845252ac6b662d5c72c29903813eJake Slack } 16403928aee4356845252ac6b662d5c72c29903813eJake Slack 16503928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 16603928aee4356845252ac6b662d5c72c29903813eJake Slack public ContextHandler getContextHandler() 16703928aee4356845252ac6b662d5c72c29903813eJake Slack { 16803928aee4356845252ac6b662d5c72c29903813eJake Slack return _context.getContextHandler(); 16903928aee4356845252ac6b662d5c72c29903813eJake Slack } 17003928aee4356845252ac6b662d5c72c29903813eJake Slack 17103928aee4356845252ac6b662d5c72c29903813eJake Slack public String getSessionPath() 17203928aee4356845252ac6b662d5c72c29903813eJake Slack { 17303928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionPath; 17403928aee4356845252ac6b662d5c72c29903813eJake Slack } 17503928aee4356845252ac6b662d5c72c29903813eJake Slack 17603928aee4356845252ac6b662d5c72c29903813eJake Slack public int getMaxCookieAge() 17703928aee4356845252ac6b662d5c72c29903813eJake Slack { 17803928aee4356845252ac6b662d5c72c29903813eJake Slack return _maxCookieAge; 17903928aee4356845252ac6b662d5c72c29903813eJake Slack } 18003928aee4356845252ac6b662d5c72c29903813eJake Slack 18103928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 18203928aee4356845252ac6b662d5c72c29903813eJake Slack public HttpCookie access(HttpSession session,boolean secure) 18303928aee4356845252ac6b662d5c72c29903813eJake Slack { 18403928aee4356845252ac6b662d5c72c29903813eJake Slack long now=System.currentTimeMillis(); 18503928aee4356845252ac6b662d5c72c29903813eJake Slack 18603928aee4356845252ac6b662d5c72c29903813eJake Slack AbstractSession s = ((SessionIf)session).getSession(); 18703928aee4356845252ac6b662d5c72c29903813eJake Slack 18803928aee4356845252ac6b662d5c72c29903813eJake Slack if (s.access(now)) 18903928aee4356845252ac6b662d5c72c29903813eJake Slack { 19003928aee4356845252ac6b662d5c72c29903813eJake Slack // Do we need to refresh the cookie? 19103928aee4356845252ac6b662d5c72c29903813eJake Slack if (isUsingCookies() && 19203928aee4356845252ac6b662d5c72c29903813eJake Slack (s.isIdChanged() || 19303928aee4356845252ac6b662d5c72c29903813eJake Slack (getSessionCookieConfig().getMaxAge()>0 && getRefreshCookieAge()>0 && ((now-s.getCookieSetTime())/1000>getRefreshCookieAge())) 19403928aee4356845252ac6b662d5c72c29903813eJake Slack ) 19503928aee4356845252ac6b662d5c72c29903813eJake Slack ) 19603928aee4356845252ac6b662d5c72c29903813eJake Slack { 19703928aee4356845252ac6b662d5c72c29903813eJake Slack HttpCookie cookie=getSessionCookie(session,_context==null?"/":(_context.getContextPath()),secure); 19803928aee4356845252ac6b662d5c72c29903813eJake Slack s.cookieSet(); 19903928aee4356845252ac6b662d5c72c29903813eJake Slack s.setIdChanged(false); 20003928aee4356845252ac6b662d5c72c29903813eJake Slack return cookie; 20103928aee4356845252ac6b662d5c72c29903813eJake Slack } 20203928aee4356845252ac6b662d5c72c29903813eJake Slack } 20303928aee4356845252ac6b662d5c72c29903813eJake Slack return null; 20403928aee4356845252ac6b662d5c72c29903813eJake Slack } 20503928aee4356845252ac6b662d5c72c29903813eJake Slack 20603928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 20703928aee4356845252ac6b662d5c72c29903813eJake Slack public void addEventListener(EventListener listener) 20803928aee4356845252ac6b662d5c72c29903813eJake Slack { 20903928aee4356845252ac6b662d5c72c29903813eJake Slack if (listener instanceof HttpSessionAttributeListener) 21003928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionAttributeListeners.add((HttpSessionAttributeListener)listener); 21103928aee4356845252ac6b662d5c72c29903813eJake Slack if (listener instanceof HttpSessionListener) 21203928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionListeners.add((HttpSessionListener)listener); 21303928aee4356845252ac6b662d5c72c29903813eJake Slack } 21403928aee4356845252ac6b662d5c72c29903813eJake Slack 21503928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 21603928aee4356845252ac6b662d5c72c29903813eJake Slack public void clearEventListeners() 21703928aee4356845252ac6b662d5c72c29903813eJake Slack { 21803928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionAttributeListeners.clear(); 21903928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionListeners.clear(); 22003928aee4356845252ac6b662d5c72c29903813eJake Slack } 22103928aee4356845252ac6b662d5c72c29903813eJake Slack 22203928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 22303928aee4356845252ac6b662d5c72c29903813eJake Slack public void complete(HttpSession session) 22403928aee4356845252ac6b662d5c72c29903813eJake Slack { 22503928aee4356845252ac6b662d5c72c29903813eJake Slack AbstractSession s = ((SessionIf)session).getSession(); 22603928aee4356845252ac6b662d5c72c29903813eJake Slack s.complete(); 22703928aee4356845252ac6b662d5c72c29903813eJake Slack } 22803928aee4356845252ac6b662d5c72c29903813eJake Slack 22903928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 23003928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 23103928aee4356845252ac6b662d5c72c29903813eJake Slack public void doStart() throws Exception 23203928aee4356845252ac6b662d5c72c29903813eJake Slack { 23303928aee4356845252ac6b662d5c72c29903813eJake Slack _context=ContextHandler.getCurrentContext(); 23403928aee4356845252ac6b662d5c72c29903813eJake Slack _loader=Thread.currentThread().getContextClassLoader(); 23503928aee4356845252ac6b662d5c72c29903813eJake Slack 23603928aee4356845252ac6b662d5c72c29903813eJake Slack if (_sessionIdManager==null) 23703928aee4356845252ac6b662d5c72c29903813eJake Slack { 23803928aee4356845252ac6b662d5c72c29903813eJake Slack final Server server=getSessionHandler().getServer(); 23903928aee4356845252ac6b662d5c72c29903813eJake Slack synchronized (server) 24003928aee4356845252ac6b662d5c72c29903813eJake Slack { 24103928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionIdManager=server.getSessionIdManager(); 24203928aee4356845252ac6b662d5c72c29903813eJake Slack if (_sessionIdManager==null) 24303928aee4356845252ac6b662d5c72c29903813eJake Slack { 24403928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionIdManager=new HashSessionIdManager(); 24503928aee4356845252ac6b662d5c72c29903813eJake Slack server.setSessionIdManager(_sessionIdManager); 24603928aee4356845252ac6b662d5c72c29903813eJake Slack } 24703928aee4356845252ac6b662d5c72c29903813eJake Slack } 24803928aee4356845252ac6b662d5c72c29903813eJake Slack } 24903928aee4356845252ac6b662d5c72c29903813eJake Slack if (!_sessionIdManager.isStarted()) 25003928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionIdManager.start(); 25103928aee4356845252ac6b662d5c72c29903813eJake Slack 25203928aee4356845252ac6b662d5c72c29903813eJake Slack // Look for a session cookie name 25303928aee4356845252ac6b662d5c72c29903813eJake Slack if (_context!=null) 25403928aee4356845252ac6b662d5c72c29903813eJake Slack { 25503928aee4356845252ac6b662d5c72c29903813eJake Slack String tmp=_context.getInitParameter(SessionManager.__SessionCookieProperty); 25603928aee4356845252ac6b662d5c72c29903813eJake Slack if (tmp!=null) 25703928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionCookie=tmp; 25803928aee4356845252ac6b662d5c72c29903813eJake Slack 25903928aee4356845252ac6b662d5c72c29903813eJake Slack tmp=_context.getInitParameter(SessionManager.__SessionIdPathParameterNameProperty); 26003928aee4356845252ac6b662d5c72c29903813eJake Slack if (tmp!=null) 26103928aee4356845252ac6b662d5c72c29903813eJake Slack setSessionIdPathParameterName(tmp); 26203928aee4356845252ac6b662d5c72c29903813eJake Slack 26303928aee4356845252ac6b662d5c72c29903813eJake Slack // set up the max session cookie age if it isn't already 26403928aee4356845252ac6b662d5c72c29903813eJake Slack if (_maxCookieAge==-1) 26503928aee4356845252ac6b662d5c72c29903813eJake Slack { 26603928aee4356845252ac6b662d5c72c29903813eJake Slack tmp=_context.getInitParameter(SessionManager.__MaxAgeProperty); 26703928aee4356845252ac6b662d5c72c29903813eJake Slack if (tmp!=null) 26803928aee4356845252ac6b662d5c72c29903813eJake Slack _maxCookieAge=Integer.parseInt(tmp.trim()); 26903928aee4356845252ac6b662d5c72c29903813eJake Slack } 27003928aee4356845252ac6b662d5c72c29903813eJake Slack 27103928aee4356845252ac6b662d5c72c29903813eJake Slack // set up the session domain if it isn't already 27203928aee4356845252ac6b662d5c72c29903813eJake Slack if (_sessionDomain==null) 27303928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionDomain=_context.getInitParameter(SessionManager.__SessionDomainProperty); 27403928aee4356845252ac6b662d5c72c29903813eJake Slack 27503928aee4356845252ac6b662d5c72c29903813eJake Slack // set up the sessionPath if it isn't already 27603928aee4356845252ac6b662d5c72c29903813eJake Slack if (_sessionPath==null) 27703928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionPath=_context.getInitParameter(SessionManager.__SessionPathProperty); 27803928aee4356845252ac6b662d5c72c29903813eJake Slack 27903928aee4356845252ac6b662d5c72c29903813eJake Slack tmp=_context.getInitParameter(SessionManager.__CheckRemoteSessionEncoding); 28003928aee4356845252ac6b662d5c72c29903813eJake Slack if (tmp!=null) 28103928aee4356845252ac6b662d5c72c29903813eJake Slack _checkingRemoteSessionIdEncoding=Boolean.parseBoolean(tmp); 28203928aee4356845252ac6b662d5c72c29903813eJake Slack } 28303928aee4356845252ac6b662d5c72c29903813eJake Slack 28403928aee4356845252ac6b662d5c72c29903813eJake Slack super.doStart(); 28503928aee4356845252ac6b662d5c72c29903813eJake Slack } 28603928aee4356845252ac6b662d5c72c29903813eJake Slack 28703928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 28803928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 28903928aee4356845252ac6b662d5c72c29903813eJake Slack public void doStop() throws Exception 29003928aee4356845252ac6b662d5c72c29903813eJake Slack { 29103928aee4356845252ac6b662d5c72c29903813eJake Slack super.doStop(); 29203928aee4356845252ac6b662d5c72c29903813eJake Slack 29303928aee4356845252ac6b662d5c72c29903813eJake Slack invalidateSessions(); 29403928aee4356845252ac6b662d5c72c29903813eJake Slack 29503928aee4356845252ac6b662d5c72c29903813eJake Slack _loader=null; 29603928aee4356845252ac6b662d5c72c29903813eJake Slack } 29703928aee4356845252ac6b662d5c72c29903813eJake Slack 29803928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 29903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 30003928aee4356845252ac6b662d5c72c29903813eJake Slack * @return Returns the httpOnly. 30103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 30203928aee4356845252ac6b662d5c72c29903813eJake Slack public boolean getHttpOnly() 30303928aee4356845252ac6b662d5c72c29903813eJake Slack { 30403928aee4356845252ac6b662d5c72c29903813eJake Slack return _httpOnly; 30503928aee4356845252ac6b662d5c72c29903813eJake Slack } 30603928aee4356845252ac6b662d5c72c29903813eJake Slack 30703928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 30803928aee4356845252ac6b662d5c72c29903813eJake Slack public HttpSession getHttpSession(String nodeId) 30903928aee4356845252ac6b662d5c72c29903813eJake Slack { 31003928aee4356845252ac6b662d5c72c29903813eJake Slack String cluster_id = getSessionIdManager().getClusterId(nodeId); 31103928aee4356845252ac6b662d5c72c29903813eJake Slack 31203928aee4356845252ac6b662d5c72c29903813eJake Slack AbstractSession session = getSession(cluster_id); 31303928aee4356845252ac6b662d5c72c29903813eJake Slack if (session!=null && !session.getNodeId().equals(nodeId)) 31403928aee4356845252ac6b662d5c72c29903813eJake Slack session.setIdChanged(true); 31503928aee4356845252ac6b662d5c72c29903813eJake Slack return session; 31603928aee4356845252ac6b662d5c72c29903813eJake Slack } 31703928aee4356845252ac6b662d5c72c29903813eJake Slack 31803928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 31903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 32003928aee4356845252ac6b662d5c72c29903813eJake Slack * @return Returns the metaManager used for cross context session management 32103928aee4356845252ac6b662d5c72c29903813eJake Slack * @deprecated Use {@link #getSessionIdManager()} 32203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 32303928aee4356845252ac6b662d5c72c29903813eJake Slack public SessionIdManager getIdManager() 32403928aee4356845252ac6b662d5c72c29903813eJake Slack { 32503928aee4356845252ac6b662d5c72c29903813eJake Slack return getSessionIdManager(); 32603928aee4356845252ac6b662d5c72c29903813eJake Slack } 32703928aee4356845252ac6b662d5c72c29903813eJake Slack 32803928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 32903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 33003928aee4356845252ac6b662d5c72c29903813eJake Slack * @return Returns the SessionIdManager used for cross context session management 33103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 33203928aee4356845252ac6b662d5c72c29903813eJake Slack public SessionIdManager getSessionIdManager() 33303928aee4356845252ac6b662d5c72c29903813eJake Slack { 33403928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionIdManager; 33503928aee4356845252ac6b662d5c72c29903813eJake Slack } 33603928aee4356845252ac6b662d5c72c29903813eJake Slack 33703928aee4356845252ac6b662d5c72c29903813eJake Slack 33803928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 33903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 34003928aee4356845252ac6b662d5c72c29903813eJake Slack * @return seconds 34103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 34203928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 34303928aee4356845252ac6b662d5c72c29903813eJake Slack public int getMaxInactiveInterval() 34403928aee4356845252ac6b662d5c72c29903813eJake Slack { 34503928aee4356845252ac6b662d5c72c29903813eJake Slack return _dftMaxIdleSecs; 34603928aee4356845252ac6b662d5c72c29903813eJake Slack } 34703928aee4356845252ac6b662d5c72c29903813eJake Slack 34803928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 34903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 35003928aee4356845252ac6b662d5c72c29903813eJake Slack * @see #getSessionsMax() 35103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 35203928aee4356845252ac6b662d5c72c29903813eJake Slack @Deprecated 35303928aee4356845252ac6b662d5c72c29903813eJake Slack public int getMaxSessions() 35403928aee4356845252ac6b662d5c72c29903813eJake Slack { 35503928aee4356845252ac6b662d5c72c29903813eJake Slack return getSessionsMax(); 35603928aee4356845252ac6b662d5c72c29903813eJake Slack } 35703928aee4356845252ac6b662d5c72c29903813eJake Slack 35803928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 35903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 36003928aee4356845252ac6b662d5c72c29903813eJake Slack * @return maximum number of sessions 36103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 36203928aee4356845252ac6b662d5c72c29903813eJake Slack public int getSessionsMax() 36303928aee4356845252ac6b662d5c72c29903813eJake Slack { 36403928aee4356845252ac6b662d5c72c29903813eJake Slack return (int)_sessionsStats.getMax(); 36503928aee4356845252ac6b662d5c72c29903813eJake Slack } 36603928aee4356845252ac6b662d5c72c29903813eJake Slack 36703928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 36803928aee4356845252ac6b662d5c72c29903813eJake Slack /** 36903928aee4356845252ac6b662d5c72c29903813eJake Slack * @return total number of sessions 37003928aee4356845252ac6b662d5c72c29903813eJake Slack */ 37103928aee4356845252ac6b662d5c72c29903813eJake Slack public int getSessionsTotal() 37203928aee4356845252ac6b662d5c72c29903813eJake Slack { 37303928aee4356845252ac6b662d5c72c29903813eJake Slack return (int)_sessionsStats.getTotal(); 37403928aee4356845252ac6b662d5c72c29903813eJake Slack } 37503928aee4356845252ac6b662d5c72c29903813eJake Slack 37603928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 37703928aee4356845252ac6b662d5c72c29903813eJake Slack /** 37803928aee4356845252ac6b662d5c72c29903813eJake Slack * @deprecated use {@link #getSessionIdManager()} 37903928aee4356845252ac6b662d5c72c29903813eJake Slack */ 38003928aee4356845252ac6b662d5c72c29903813eJake Slack @Deprecated 38103928aee4356845252ac6b662d5c72c29903813eJake Slack public SessionIdManager getMetaManager() 38203928aee4356845252ac6b662d5c72c29903813eJake Slack { 38303928aee4356845252ac6b662d5c72c29903813eJake Slack return getSessionIdManager(); 38403928aee4356845252ac6b662d5c72c29903813eJake Slack } 38503928aee4356845252ac6b662d5c72c29903813eJake Slack 38603928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 38703928aee4356845252ac6b662d5c72c29903813eJake Slack /** 38803928aee4356845252ac6b662d5c72c29903813eJake Slack * @deprecated always returns 0. no replacement available. 38903928aee4356845252ac6b662d5c72c29903813eJake Slack */ 39003928aee4356845252ac6b662d5c72c29903813eJake Slack @Deprecated 39103928aee4356845252ac6b662d5c72c29903813eJake Slack public int getMinSessions() 39203928aee4356845252ac6b662d5c72c29903813eJake Slack { 39303928aee4356845252ac6b662d5c72c29903813eJake Slack return 0; 39403928aee4356845252ac6b662d5c72c29903813eJake Slack } 39503928aee4356845252ac6b662d5c72c29903813eJake Slack 39603928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 39703928aee4356845252ac6b662d5c72c29903813eJake Slack public int getRefreshCookieAge() 39803928aee4356845252ac6b662d5c72c29903813eJake Slack { 39903928aee4356845252ac6b662d5c72c29903813eJake Slack return _refreshCookieAge; 40003928aee4356845252ac6b662d5c72c29903813eJake Slack } 40103928aee4356845252ac6b662d5c72c29903813eJake Slack 40203928aee4356845252ac6b662d5c72c29903813eJake Slack 40303928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 40403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 40503928aee4356845252ac6b662d5c72c29903813eJake Slack * @return same as SessionCookieConfig.getSecure(). If true, session 40603928aee4356845252ac6b662d5c72c29903813eJake Slack * cookies are ALWAYS marked as secure. If false, a session cookie is 40703928aee4356845252ac6b662d5c72c29903813eJake Slack * ONLY marked as secure if _secureRequestOnly == true and it is a HTTPS request. 40803928aee4356845252ac6b662d5c72c29903813eJake Slack */ 40903928aee4356845252ac6b662d5c72c29903813eJake Slack public boolean getSecureCookies() 41003928aee4356845252ac6b662d5c72c29903813eJake Slack { 41103928aee4356845252ac6b662d5c72c29903813eJake Slack return _secureCookies; 41203928aee4356845252ac6b662d5c72c29903813eJake Slack } 41303928aee4356845252ac6b662d5c72c29903813eJake Slack 41403928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 41503928aee4356845252ac6b662d5c72c29903813eJake Slack /** 41603928aee4356845252ac6b662d5c72c29903813eJake Slack * @return true if session cookie is to be marked as secure only on HTTPS requests 41703928aee4356845252ac6b662d5c72c29903813eJake Slack */ 41803928aee4356845252ac6b662d5c72c29903813eJake Slack public boolean isSecureRequestOnly() 41903928aee4356845252ac6b662d5c72c29903813eJake Slack { 42003928aee4356845252ac6b662d5c72c29903813eJake Slack return _secureRequestOnly; 42103928aee4356845252ac6b662d5c72c29903813eJake Slack } 42203928aee4356845252ac6b662d5c72c29903813eJake Slack 42303928aee4356845252ac6b662d5c72c29903813eJake Slack 42403928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 42503928aee4356845252ac6b662d5c72c29903813eJake Slack /** 42603928aee4356845252ac6b662d5c72c29903813eJake Slack * @return if true, session cookie will be marked as secure only iff 42703928aee4356845252ac6b662d5c72c29903813eJake Slack * HTTPS request. Can be overridden by setting SessionCookieConfig.setSecure(true), 42803928aee4356845252ac6b662d5c72c29903813eJake Slack * in which case the session cookie will be marked as secure on both HTTPS and HTTP. 42903928aee4356845252ac6b662d5c72c29903813eJake Slack */ 43003928aee4356845252ac6b662d5c72c29903813eJake Slack public void setSecureRequestOnly(boolean secureRequestOnly) 43103928aee4356845252ac6b662d5c72c29903813eJake Slack { 43203928aee4356845252ac6b662d5c72c29903813eJake Slack _secureRequestOnly = secureRequestOnly; 43303928aee4356845252ac6b662d5c72c29903813eJake Slack } 43403928aee4356845252ac6b662d5c72c29903813eJake Slack 43503928aee4356845252ac6b662d5c72c29903813eJake Slack 43603928aee4356845252ac6b662d5c72c29903813eJake Slack 43703928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 43803928aee4356845252ac6b662d5c72c29903813eJake Slack public String getSessionCookie() 43903928aee4356845252ac6b662d5c72c29903813eJake Slack { 44003928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionCookie; 44103928aee4356845252ac6b662d5c72c29903813eJake Slack } 44203928aee4356845252ac6b662d5c72c29903813eJake Slack 44303928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 44403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 44503928aee4356845252ac6b662d5c72c29903813eJake Slack * A sessioncookie is marked as secure IFF any of the following conditions are true: 44603928aee4356845252ac6b662d5c72c29903813eJake Slack * <ol> 44703928aee4356845252ac6b662d5c72c29903813eJake Slack * <li>SessionCookieConfig.setSecure == true</li> 44803928aee4356845252ac6b662d5c72c29903813eJake Slack * <li>SessionCookieConfig.setSecure == false && _secureRequestOnly==true && request is HTTPS</li> 44903928aee4356845252ac6b662d5c72c29903813eJake Slack * </ol> 45003928aee4356845252ac6b662d5c72c29903813eJake Slack * According to SessionCookieConfig javadoc, case 1 can be used when: 45103928aee4356845252ac6b662d5c72c29903813eJake Slack * "... even though the request that initiated the session came over HTTP, 45203928aee4356845252ac6b662d5c72c29903813eJake Slack * is to support a topology where the web container is front-ended by an 45303928aee4356845252ac6b662d5c72c29903813eJake Slack * SSL offloading load balancer. In this case, the traffic between the client 45403928aee4356845252ac6b662d5c72c29903813eJake Slack * and the load balancer will be over HTTPS, whereas the traffic between the 45503928aee4356845252ac6b662d5c72c29903813eJake Slack * load balancer and the web container will be over HTTP." 45603928aee4356845252ac6b662d5c72c29903813eJake Slack * 45703928aee4356845252ac6b662d5c72c29903813eJake Slack * For case 2, you can use _secureRequestOnly to determine if you want the 45803928aee4356845252ac6b662d5c72c29903813eJake Slack * Servlet Spec 3.0 default behaviour when SessionCookieConfig.setSecure==false, 45903928aee4356845252ac6b662d5c72c29903813eJake Slack * which is: 46003928aee4356845252ac6b662d5c72c29903813eJake Slack * "they shall be marked as secure only if the request that initiated the 46103928aee4356845252ac6b662d5c72c29903813eJake Slack * corresponding session was also secure" 46203928aee4356845252ac6b662d5c72c29903813eJake Slack * 46303928aee4356845252ac6b662d5c72c29903813eJake Slack * The default for _secureRequestOnly is true, which gives the above behaviour. If 46403928aee4356845252ac6b662d5c72c29903813eJake Slack * you set it to false, then a session cookie is NEVER marked as secure, even if 46503928aee4356845252ac6b662d5c72c29903813eJake Slack * the initiating request was secure. 46603928aee4356845252ac6b662d5c72c29903813eJake Slack * 46703928aee4356845252ac6b662d5c72c29903813eJake Slack * @see org.eclipse.jetty.server.SessionManager#getSessionCookie(javax.servlet.http.HttpSession, java.lang.String, boolean) 46803928aee4356845252ac6b662d5c72c29903813eJake Slack */ 46903928aee4356845252ac6b662d5c72c29903813eJake Slack public HttpCookie getSessionCookie(HttpSession session, String contextPath, boolean requestIsSecure) 47003928aee4356845252ac6b662d5c72c29903813eJake Slack { 47103928aee4356845252ac6b662d5c72c29903813eJake Slack if (isUsingCookies()) 47203928aee4356845252ac6b662d5c72c29903813eJake Slack { 47303928aee4356845252ac6b662d5c72c29903813eJake Slack String sessionPath = (_sessionPath==null) ? contextPath : _sessionPath; 47403928aee4356845252ac6b662d5c72c29903813eJake Slack sessionPath = (sessionPath==null||sessionPath.length()==0) ? "/" : sessionPath; 47503928aee4356845252ac6b662d5c72c29903813eJake Slack String id = getNodeId(session); 47603928aee4356845252ac6b662d5c72c29903813eJake Slack HttpCookie cookie = null; 47703928aee4356845252ac6b662d5c72c29903813eJake Slack if (_sessionComment == null) 47803928aee4356845252ac6b662d5c72c29903813eJake Slack { 47903928aee4356845252ac6b662d5c72c29903813eJake Slack cookie = new HttpCookie( 48003928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionCookie, 48103928aee4356845252ac6b662d5c72c29903813eJake Slack id, 48203928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionDomain, 48303928aee4356845252ac6b662d5c72c29903813eJake Slack sessionPath, 48403928aee4356845252ac6b662d5c72c29903813eJake Slack _cookieConfig.getMaxAge(), 48503928aee4356845252ac6b662d5c72c29903813eJake Slack _cookieConfig.isHttpOnly(), 48603928aee4356845252ac6b662d5c72c29903813eJake Slack _cookieConfig.isSecure() || (isSecureRequestOnly() && requestIsSecure)); 48703928aee4356845252ac6b662d5c72c29903813eJake Slack } 48803928aee4356845252ac6b662d5c72c29903813eJake Slack else 48903928aee4356845252ac6b662d5c72c29903813eJake Slack { 49003928aee4356845252ac6b662d5c72c29903813eJake Slack cookie = new HttpCookie( 49103928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionCookie, 49203928aee4356845252ac6b662d5c72c29903813eJake Slack id, 49303928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionDomain, 49403928aee4356845252ac6b662d5c72c29903813eJake Slack sessionPath, 49503928aee4356845252ac6b662d5c72c29903813eJake Slack _cookieConfig.getMaxAge(), 49603928aee4356845252ac6b662d5c72c29903813eJake Slack _cookieConfig.isHttpOnly(), 49703928aee4356845252ac6b662d5c72c29903813eJake Slack _cookieConfig.isSecure() || (isSecureRequestOnly() && requestIsSecure), 49803928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionComment, 49903928aee4356845252ac6b662d5c72c29903813eJake Slack 1); 50003928aee4356845252ac6b662d5c72c29903813eJake Slack } 50103928aee4356845252ac6b662d5c72c29903813eJake Slack 50203928aee4356845252ac6b662d5c72c29903813eJake Slack return cookie; 50303928aee4356845252ac6b662d5c72c29903813eJake Slack } 50403928aee4356845252ac6b662d5c72c29903813eJake Slack return null; 50503928aee4356845252ac6b662d5c72c29903813eJake Slack } 50603928aee4356845252ac6b662d5c72c29903813eJake Slack 50703928aee4356845252ac6b662d5c72c29903813eJake Slack public String getSessionDomain() 50803928aee4356845252ac6b662d5c72c29903813eJake Slack { 50903928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionDomain; 51003928aee4356845252ac6b662d5c72c29903813eJake Slack } 51103928aee4356845252ac6b662d5c72c29903813eJake Slack 51203928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 51303928aee4356845252ac6b662d5c72c29903813eJake Slack /** 51403928aee4356845252ac6b662d5c72c29903813eJake Slack * @return Returns the sessionHandler. 51503928aee4356845252ac6b662d5c72c29903813eJake Slack */ 51603928aee4356845252ac6b662d5c72c29903813eJake Slack public SessionHandler getSessionHandler() 51703928aee4356845252ac6b662d5c72c29903813eJake Slack { 51803928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionHandler; 51903928aee4356845252ac6b662d5c72c29903813eJake Slack } 52003928aee4356845252ac6b662d5c72c29903813eJake Slack 52103928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 52203928aee4356845252ac6b662d5c72c29903813eJake Slack /** 52303928aee4356845252ac6b662d5c72c29903813eJake Slack * @deprecated Need to review if it is needed. 52403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 52503928aee4356845252ac6b662d5c72c29903813eJake Slack @SuppressWarnings("rawtypes") 52603928aee4356845252ac6b662d5c72c29903813eJake Slack public Map getSessionMap() 52703928aee4356845252ac6b662d5c72c29903813eJake Slack { 52803928aee4356845252ac6b662d5c72c29903813eJake Slack throw new UnsupportedOperationException(); 52903928aee4356845252ac6b662d5c72c29903813eJake Slack } 53003928aee4356845252ac6b662d5c72c29903813eJake Slack 53103928aee4356845252ac6b662d5c72c29903813eJake Slack 53203928aee4356845252ac6b662d5c72c29903813eJake Slack 53303928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 53403928aee4356845252ac6b662d5c72c29903813eJake Slack public int getSessions() 53503928aee4356845252ac6b662d5c72c29903813eJake Slack { 53603928aee4356845252ac6b662d5c72c29903813eJake Slack return (int)_sessionsStats.getCurrent(); 53703928aee4356845252ac6b662d5c72c29903813eJake Slack } 53803928aee4356845252ac6b662d5c72c29903813eJake Slack 53903928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 54003928aee4356845252ac6b662d5c72c29903813eJake Slack public String getSessionIdPathParameterName() 54103928aee4356845252ac6b662d5c72c29903813eJake Slack { 54203928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionIdPathParameterName; 54303928aee4356845252ac6b662d5c72c29903813eJake Slack } 54403928aee4356845252ac6b662d5c72c29903813eJake Slack 54503928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 54603928aee4356845252ac6b662d5c72c29903813eJake Slack public String getSessionIdPathParameterNamePrefix() 54703928aee4356845252ac6b662d5c72c29903813eJake Slack { 54803928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionIdPathParameterNamePrefix; 54903928aee4356845252ac6b662d5c72c29903813eJake Slack } 55003928aee4356845252ac6b662d5c72c29903813eJake Slack 55103928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 55203928aee4356845252ac6b662d5c72c29903813eJake Slack /** 55303928aee4356845252ac6b662d5c72c29903813eJake Slack * @return Returns the usingCookies. 55403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 55503928aee4356845252ac6b662d5c72c29903813eJake Slack public boolean isUsingCookies() 55603928aee4356845252ac6b662d5c72c29903813eJake Slack { 55703928aee4356845252ac6b662d5c72c29903813eJake Slack return _usingCookies; 55803928aee4356845252ac6b662d5c72c29903813eJake Slack } 55903928aee4356845252ac6b662d5c72c29903813eJake Slack 56003928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 56103928aee4356845252ac6b662d5c72c29903813eJake Slack public boolean isValid(HttpSession session) 56203928aee4356845252ac6b662d5c72c29903813eJake Slack { 56303928aee4356845252ac6b662d5c72c29903813eJake Slack AbstractSession s = ((SessionIf)session).getSession(); 56403928aee4356845252ac6b662d5c72c29903813eJake Slack return s.isValid(); 56503928aee4356845252ac6b662d5c72c29903813eJake Slack } 56603928aee4356845252ac6b662d5c72c29903813eJake Slack 56703928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 56803928aee4356845252ac6b662d5c72c29903813eJake Slack public String getClusterId(HttpSession session) 56903928aee4356845252ac6b662d5c72c29903813eJake Slack { 57003928aee4356845252ac6b662d5c72c29903813eJake Slack AbstractSession s = ((SessionIf)session).getSession(); 57103928aee4356845252ac6b662d5c72c29903813eJake Slack return s.getClusterId(); 57203928aee4356845252ac6b662d5c72c29903813eJake Slack } 57303928aee4356845252ac6b662d5c72c29903813eJake Slack 57403928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 57503928aee4356845252ac6b662d5c72c29903813eJake Slack public String getNodeId(HttpSession session) 57603928aee4356845252ac6b662d5c72c29903813eJake Slack { 57703928aee4356845252ac6b662d5c72c29903813eJake Slack AbstractSession s = ((SessionIf)session).getSession(); 57803928aee4356845252ac6b662d5c72c29903813eJake Slack return s.getNodeId(); 57903928aee4356845252ac6b662d5c72c29903813eJake Slack } 58003928aee4356845252ac6b662d5c72c29903813eJake Slack 58103928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 58203928aee4356845252ac6b662d5c72c29903813eJake Slack /** 58303928aee4356845252ac6b662d5c72c29903813eJake Slack * Create a new HttpSession for a request 58403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 58503928aee4356845252ac6b662d5c72c29903813eJake Slack public HttpSession newHttpSession(HttpServletRequest request) 58603928aee4356845252ac6b662d5c72c29903813eJake Slack { 58703928aee4356845252ac6b662d5c72c29903813eJake Slack AbstractSession session=newSession(request); 58803928aee4356845252ac6b662d5c72c29903813eJake Slack session.setMaxInactiveInterval(_dftMaxIdleSecs); 58903928aee4356845252ac6b662d5c72c29903813eJake Slack addSession(session,true); 59003928aee4356845252ac6b662d5c72c29903813eJake Slack return session; 59103928aee4356845252ac6b662d5c72c29903813eJake Slack } 59203928aee4356845252ac6b662d5c72c29903813eJake Slack 59303928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 59403928aee4356845252ac6b662d5c72c29903813eJake Slack public void removeEventListener(EventListener listener) 59503928aee4356845252ac6b662d5c72c29903813eJake Slack { 59603928aee4356845252ac6b662d5c72c29903813eJake Slack if (listener instanceof HttpSessionAttributeListener) 59703928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionAttributeListeners.remove(listener); 59803928aee4356845252ac6b662d5c72c29903813eJake Slack if (listener instanceof HttpSessionListener) 59903928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionListeners.remove(listener); 60003928aee4356845252ac6b662d5c72c29903813eJake Slack } 60103928aee4356845252ac6b662d5c72c29903813eJake Slack 60203928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 60303928aee4356845252ac6b662d5c72c29903813eJake Slack /** 60403928aee4356845252ac6b662d5c72c29903813eJake Slack * @see #statsReset() 60503928aee4356845252ac6b662d5c72c29903813eJake Slack */ 60603928aee4356845252ac6b662d5c72c29903813eJake Slack @Deprecated 60703928aee4356845252ac6b662d5c72c29903813eJake Slack public void resetStats() 60803928aee4356845252ac6b662d5c72c29903813eJake Slack { 60903928aee4356845252ac6b662d5c72c29903813eJake Slack statsReset(); 61003928aee4356845252ac6b662d5c72c29903813eJake Slack } 61103928aee4356845252ac6b662d5c72c29903813eJake Slack 61203928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 61303928aee4356845252ac6b662d5c72c29903813eJake Slack /** 61403928aee4356845252ac6b662d5c72c29903813eJake Slack * Reset statistics values 61503928aee4356845252ac6b662d5c72c29903813eJake Slack */ 61603928aee4356845252ac6b662d5c72c29903813eJake Slack public void statsReset() 61703928aee4356845252ac6b662d5c72c29903813eJake Slack { 61803928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionsStats.reset(getSessions()); 61903928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionTimeStats.reset(); 62003928aee4356845252ac6b662d5c72c29903813eJake Slack } 62103928aee4356845252ac6b662d5c72c29903813eJake Slack 62203928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 62303928aee4356845252ac6b662d5c72c29903813eJake Slack /** 62403928aee4356845252ac6b662d5c72c29903813eJake Slack * @param httpOnly 62503928aee4356845252ac6b662d5c72c29903813eJake Slack * The httpOnly to set. 62603928aee4356845252ac6b662d5c72c29903813eJake Slack */ 62703928aee4356845252ac6b662d5c72c29903813eJake Slack public void setHttpOnly(boolean httpOnly) 62803928aee4356845252ac6b662d5c72c29903813eJake Slack { 62903928aee4356845252ac6b662d5c72c29903813eJake Slack _httpOnly=httpOnly; 63003928aee4356845252ac6b662d5c72c29903813eJake Slack } 63103928aee4356845252ac6b662d5c72c29903813eJake Slack 63203928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 63303928aee4356845252ac6b662d5c72c29903813eJake Slack /** 63403928aee4356845252ac6b662d5c72c29903813eJake Slack * @param metaManager The metaManager used for cross context session management. 63503928aee4356845252ac6b662d5c72c29903813eJake Slack * @deprecated use {@link #setSessionIdManager(SessionIdManager)} 63603928aee4356845252ac6b662d5c72c29903813eJake Slack */ 63703928aee4356845252ac6b662d5c72c29903813eJake Slack public void setIdManager(SessionIdManager metaManager) 63803928aee4356845252ac6b662d5c72c29903813eJake Slack { 63903928aee4356845252ac6b662d5c72c29903813eJake Slack setSessionIdManager(metaManager); 64003928aee4356845252ac6b662d5c72c29903813eJake Slack } 64103928aee4356845252ac6b662d5c72c29903813eJake Slack 64203928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 64303928aee4356845252ac6b662d5c72c29903813eJake Slack /** 64403928aee4356845252ac6b662d5c72c29903813eJake Slack * @param metaManager The metaManager used for cross context session management. 64503928aee4356845252ac6b662d5c72c29903813eJake Slack */ 64603928aee4356845252ac6b662d5c72c29903813eJake Slack public void setSessionIdManager(SessionIdManager metaManager) 64703928aee4356845252ac6b662d5c72c29903813eJake Slack { 64803928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionIdManager=metaManager; 64903928aee4356845252ac6b662d5c72c29903813eJake Slack } 65003928aee4356845252ac6b662d5c72c29903813eJake Slack 65103928aee4356845252ac6b662d5c72c29903813eJake Slack 65203928aee4356845252ac6b662d5c72c29903813eJake Slack 65303928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 65403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 65503928aee4356845252ac6b662d5c72c29903813eJake Slack * @param seconds 65603928aee4356845252ac6b662d5c72c29903813eJake Slack */ 65703928aee4356845252ac6b662d5c72c29903813eJake Slack public void setMaxInactiveInterval(int seconds) 65803928aee4356845252ac6b662d5c72c29903813eJake Slack { 65903928aee4356845252ac6b662d5c72c29903813eJake Slack _dftMaxIdleSecs=seconds; 66003928aee4356845252ac6b662d5c72c29903813eJake Slack } 66103928aee4356845252ac6b662d5c72c29903813eJake Slack 66203928aee4356845252ac6b662d5c72c29903813eJake Slack 66303928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 66403928aee4356845252ac6b662d5c72c29903813eJake Slack public void setRefreshCookieAge(int ageInSeconds) 66503928aee4356845252ac6b662d5c72c29903813eJake Slack { 66603928aee4356845252ac6b662d5c72c29903813eJake Slack _refreshCookieAge=ageInSeconds; 66703928aee4356845252ac6b662d5c72c29903813eJake Slack } 66803928aee4356845252ac6b662d5c72c29903813eJake Slack 66903928aee4356845252ac6b662d5c72c29903813eJake Slack 67003928aee4356845252ac6b662d5c72c29903813eJake Slack 67103928aee4356845252ac6b662d5c72c29903813eJake Slack public void setSessionCookie(String cookieName) 67203928aee4356845252ac6b662d5c72c29903813eJake Slack { 67303928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionCookie=cookieName; 67403928aee4356845252ac6b662d5c72c29903813eJake Slack } 67503928aee4356845252ac6b662d5c72c29903813eJake Slack 67603928aee4356845252ac6b662d5c72c29903813eJake Slack 67703928aee4356845252ac6b662d5c72c29903813eJake Slack 67803928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 67903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 68003928aee4356845252ac6b662d5c72c29903813eJake Slack * @param sessionHandler 68103928aee4356845252ac6b662d5c72c29903813eJake Slack * The sessionHandler to set. 68203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 68303928aee4356845252ac6b662d5c72c29903813eJake Slack public void setSessionHandler(SessionHandler sessionHandler) 68403928aee4356845252ac6b662d5c72c29903813eJake Slack { 68503928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionHandler=sessionHandler; 68603928aee4356845252ac6b662d5c72c29903813eJake Slack } 68703928aee4356845252ac6b662d5c72c29903813eJake Slack 68803928aee4356845252ac6b662d5c72c29903813eJake Slack 68903928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 69003928aee4356845252ac6b662d5c72c29903813eJake Slack public void setSessionIdPathParameterName(String param) 69103928aee4356845252ac6b662d5c72c29903813eJake Slack { 69203928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionIdPathParameterName =(param==null||"none".equals(param))?null:param; 69303928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionIdPathParameterNamePrefix =(param==null||"none".equals(param))?null:(";"+ _sessionIdPathParameterName +"="); 69403928aee4356845252ac6b662d5c72c29903813eJake Slack } 69503928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 69603928aee4356845252ac6b662d5c72c29903813eJake Slack /** 69703928aee4356845252ac6b662d5c72c29903813eJake Slack * @param usingCookies 69803928aee4356845252ac6b662d5c72c29903813eJake Slack * The usingCookies to set. 69903928aee4356845252ac6b662d5c72c29903813eJake Slack */ 70003928aee4356845252ac6b662d5c72c29903813eJake Slack public void setUsingCookies(boolean usingCookies) 70103928aee4356845252ac6b662d5c72c29903813eJake Slack { 70203928aee4356845252ac6b662d5c72c29903813eJake Slack _usingCookies=usingCookies; 70303928aee4356845252ac6b662d5c72c29903813eJake Slack } 70403928aee4356845252ac6b662d5c72c29903813eJake Slack 70503928aee4356845252ac6b662d5c72c29903813eJake Slack 70603928aee4356845252ac6b662d5c72c29903813eJake Slack protected abstract void addSession(AbstractSession session); 70703928aee4356845252ac6b662d5c72c29903813eJake Slack 70803928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 70903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 71003928aee4356845252ac6b662d5c72c29903813eJake Slack * Add the session Registers the session with this manager and registers the 71103928aee4356845252ac6b662d5c72c29903813eJake Slack * session ID with the sessionIDManager; 71203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 71303928aee4356845252ac6b662d5c72c29903813eJake Slack protected void addSession(AbstractSession session, boolean created) 71403928aee4356845252ac6b662d5c72c29903813eJake Slack { 71503928aee4356845252ac6b662d5c72c29903813eJake Slack synchronized (_sessionIdManager) 71603928aee4356845252ac6b662d5c72c29903813eJake Slack { 71703928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionIdManager.addSession(session); 71803928aee4356845252ac6b662d5c72c29903813eJake Slack addSession(session); 71903928aee4356845252ac6b662d5c72c29903813eJake Slack } 72003928aee4356845252ac6b662d5c72c29903813eJake Slack 72103928aee4356845252ac6b662d5c72c29903813eJake Slack if (created) 72203928aee4356845252ac6b662d5c72c29903813eJake Slack { 72303928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionsStats.increment(); 72403928aee4356845252ac6b662d5c72c29903813eJake Slack if (_sessionListeners!=null) 72503928aee4356845252ac6b662d5c72c29903813eJake Slack { 72603928aee4356845252ac6b662d5c72c29903813eJake Slack HttpSessionEvent event=new HttpSessionEvent(session); 72703928aee4356845252ac6b662d5c72c29903813eJake Slack for (HttpSessionListener listener : _sessionListeners) 72803928aee4356845252ac6b662d5c72c29903813eJake Slack listener.sessionCreated(event); 72903928aee4356845252ac6b662d5c72c29903813eJake Slack } 73003928aee4356845252ac6b662d5c72c29903813eJake Slack } 73103928aee4356845252ac6b662d5c72c29903813eJake Slack } 73203928aee4356845252ac6b662d5c72c29903813eJake Slack 73303928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 73403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 73503928aee4356845252ac6b662d5c72c29903813eJake Slack * Get a known existing session 73603928aee4356845252ac6b662d5c72c29903813eJake Slack * @param idInCluster The session ID in the cluster, stripped of any worker name. 73703928aee4356845252ac6b662d5c72c29903813eJake Slack * @return A Session or null if none exists. 73803928aee4356845252ac6b662d5c72c29903813eJake Slack */ 73903928aee4356845252ac6b662d5c72c29903813eJake Slack public abstract AbstractSession getSession(String idInCluster); 74003928aee4356845252ac6b662d5c72c29903813eJake Slack 74103928aee4356845252ac6b662d5c72c29903813eJake Slack protected abstract void invalidateSessions() throws Exception; 74203928aee4356845252ac6b662d5c72c29903813eJake Slack 74303928aee4356845252ac6b662d5c72c29903813eJake Slack 74403928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 74503928aee4356845252ac6b662d5c72c29903813eJake Slack /** 74603928aee4356845252ac6b662d5c72c29903813eJake Slack * Create a new session instance 74703928aee4356845252ac6b662d5c72c29903813eJake Slack * @param request 74803928aee4356845252ac6b662d5c72c29903813eJake Slack * @return the new session 74903928aee4356845252ac6b662d5c72c29903813eJake Slack */ 75003928aee4356845252ac6b662d5c72c29903813eJake Slack protected abstract AbstractSession newSession(HttpServletRequest request); 75103928aee4356845252ac6b662d5c72c29903813eJake Slack 75203928aee4356845252ac6b662d5c72c29903813eJake Slack 75303928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 75403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 75503928aee4356845252ac6b662d5c72c29903813eJake Slack * @return true if the cluster node id (worker id) is returned as part of the session id by {@link HttpSession#getId()}. Default is false. 75603928aee4356845252ac6b662d5c72c29903813eJake Slack */ 75703928aee4356845252ac6b662d5c72c29903813eJake Slack public boolean isNodeIdInSessionId() 75803928aee4356845252ac6b662d5c72c29903813eJake Slack { 75903928aee4356845252ac6b662d5c72c29903813eJake Slack return _nodeIdInSessionId; 76003928aee4356845252ac6b662d5c72c29903813eJake Slack } 76103928aee4356845252ac6b662d5c72c29903813eJake Slack 76203928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 76303928aee4356845252ac6b662d5c72c29903813eJake Slack /** 76403928aee4356845252ac6b662d5c72c29903813eJake Slack * @param nodeIdInSessionId true if the cluster node id (worker id) will be returned as part of the session id by {@link HttpSession#getId()}. Default is false. 76503928aee4356845252ac6b662d5c72c29903813eJake Slack */ 76603928aee4356845252ac6b662d5c72c29903813eJake Slack public void setNodeIdInSessionId(boolean nodeIdInSessionId) 76703928aee4356845252ac6b662d5c72c29903813eJake Slack { 76803928aee4356845252ac6b662d5c72c29903813eJake Slack _nodeIdInSessionId=nodeIdInSessionId; 76903928aee4356845252ac6b662d5c72c29903813eJake Slack } 77003928aee4356845252ac6b662d5c72c29903813eJake Slack 77103928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 77203928aee4356845252ac6b662d5c72c29903813eJake Slack /** Remove session from manager 77303928aee4356845252ac6b662d5c72c29903813eJake Slack * @param session The session to remove 77403928aee4356845252ac6b662d5c72c29903813eJake Slack * @param invalidate True if {@link HttpSessionListener#sessionDestroyed(HttpSessionEvent)} and 77503928aee4356845252ac6b662d5c72c29903813eJake Slack * {@link SessionIdManager#invalidateAll(String)} should be called. 77603928aee4356845252ac6b662d5c72c29903813eJake Slack */ 77703928aee4356845252ac6b662d5c72c29903813eJake Slack public void removeSession(HttpSession session, boolean invalidate) 77803928aee4356845252ac6b662d5c72c29903813eJake Slack { 77903928aee4356845252ac6b662d5c72c29903813eJake Slack AbstractSession s = ((SessionIf)session).getSession(); 78003928aee4356845252ac6b662d5c72c29903813eJake Slack removeSession(s,invalidate); 78103928aee4356845252ac6b662d5c72c29903813eJake Slack } 78203928aee4356845252ac6b662d5c72c29903813eJake Slack 78303928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 78403928aee4356845252ac6b662d5c72c29903813eJake Slack /** Remove session from manager 78503928aee4356845252ac6b662d5c72c29903813eJake Slack * @param session The session to remove 78603928aee4356845252ac6b662d5c72c29903813eJake Slack * @param invalidate True if {@link HttpSessionListener#sessionDestroyed(HttpSessionEvent)} and 78703928aee4356845252ac6b662d5c72c29903813eJake Slack * {@link SessionIdManager#invalidateAll(String)} should be called. 78803928aee4356845252ac6b662d5c72c29903813eJake Slack */ 78903928aee4356845252ac6b662d5c72c29903813eJake Slack public void removeSession(AbstractSession session, boolean invalidate) 79003928aee4356845252ac6b662d5c72c29903813eJake Slack { 79103928aee4356845252ac6b662d5c72c29903813eJake Slack // Remove session from context and global maps 79203928aee4356845252ac6b662d5c72c29903813eJake Slack boolean removed = removeSession(session.getClusterId()); 79303928aee4356845252ac6b662d5c72c29903813eJake Slack 79403928aee4356845252ac6b662d5c72c29903813eJake Slack if (removed) 79503928aee4356845252ac6b662d5c72c29903813eJake Slack { 79603928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionsStats.decrement(); 79703928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionTimeStats.set(round((System.currentTimeMillis() - session.getCreationTime())/1000.0)); 79803928aee4356845252ac6b662d5c72c29903813eJake Slack 79903928aee4356845252ac6b662d5c72c29903813eJake Slack // Remove session from all context and global id maps 80003928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionIdManager.removeSession(session); 80103928aee4356845252ac6b662d5c72c29903813eJake Slack if (invalidate) 80203928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionIdManager.invalidateAll(session.getClusterId()); 80303928aee4356845252ac6b662d5c72c29903813eJake Slack 80403928aee4356845252ac6b662d5c72c29903813eJake Slack if (invalidate && _sessionListeners!=null) 80503928aee4356845252ac6b662d5c72c29903813eJake Slack { 80603928aee4356845252ac6b662d5c72c29903813eJake Slack HttpSessionEvent event=new HttpSessionEvent(session); 80703928aee4356845252ac6b662d5c72c29903813eJake Slack for (HttpSessionListener listener : _sessionListeners) 80803928aee4356845252ac6b662d5c72c29903813eJake Slack listener.sessionDestroyed(event); 80903928aee4356845252ac6b662d5c72c29903813eJake Slack } 81003928aee4356845252ac6b662d5c72c29903813eJake Slack } 81103928aee4356845252ac6b662d5c72c29903813eJake Slack } 81203928aee4356845252ac6b662d5c72c29903813eJake Slack 81303928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 81403928aee4356845252ac6b662d5c72c29903813eJake Slack protected abstract boolean removeSession(String idInCluster); 81503928aee4356845252ac6b662d5c72c29903813eJake Slack 81603928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 81703928aee4356845252ac6b662d5c72c29903813eJake Slack /** 81803928aee4356845252ac6b662d5c72c29903813eJake Slack * @return maximum amount of time session remained valid 81903928aee4356845252ac6b662d5c72c29903813eJake Slack */ 82003928aee4356845252ac6b662d5c72c29903813eJake Slack public long getSessionTimeMax() 82103928aee4356845252ac6b662d5c72c29903813eJake Slack { 82203928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionTimeStats.getMax(); 82303928aee4356845252ac6b662d5c72c29903813eJake Slack } 82403928aee4356845252ac6b662d5c72c29903813eJake Slack 82503928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 82603928aee4356845252ac6b662d5c72c29903813eJake Slack public Set<SessionTrackingMode> getDefaultSessionTrackingModes() 82703928aee4356845252ac6b662d5c72c29903813eJake Slack { 82803928aee4356845252ac6b662d5c72c29903813eJake Slack return __defaultSessionTrackingModes; 82903928aee4356845252ac6b662d5c72c29903813eJake Slack } 83003928aee4356845252ac6b662d5c72c29903813eJake Slack 83103928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 83203928aee4356845252ac6b662d5c72c29903813eJake Slack public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() 83303928aee4356845252ac6b662d5c72c29903813eJake Slack { 83403928aee4356845252ac6b662d5c72c29903813eJake Slack return Collections.unmodifiableSet(_sessionTrackingModes); 83503928aee4356845252ac6b662d5c72c29903813eJake Slack } 83603928aee4356845252ac6b662d5c72c29903813eJake Slack 83703928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 83803928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 83903928aee4356845252ac6b662d5c72c29903813eJake Slack public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes) 84003928aee4356845252ac6b662d5c72c29903813eJake Slack { 84103928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionTrackingModes=new HashSet<SessionTrackingMode>(sessionTrackingModes); 84203928aee4356845252ac6b662d5c72c29903813eJake Slack _usingCookies=_sessionTrackingModes.contains(SessionTrackingMode.COOKIE); 84303928aee4356845252ac6b662d5c72c29903813eJake Slack _usingURLs=_sessionTrackingModes.contains(SessionTrackingMode.URL); 84403928aee4356845252ac6b662d5c72c29903813eJake Slack } 84503928aee4356845252ac6b662d5c72c29903813eJake Slack 84603928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 84703928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 84803928aee4356845252ac6b662d5c72c29903813eJake Slack public boolean isUsingURLs() 84903928aee4356845252ac6b662d5c72c29903813eJake Slack { 85003928aee4356845252ac6b662d5c72c29903813eJake Slack return _usingURLs; 85103928aee4356845252ac6b662d5c72c29903813eJake Slack } 85203928aee4356845252ac6b662d5c72c29903813eJake Slack 85303928aee4356845252ac6b662d5c72c29903813eJake Slack 85403928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 85503928aee4356845252ac6b662d5c72c29903813eJake Slack public SessionCookieConfig getSessionCookieConfig() 85603928aee4356845252ac6b662d5c72c29903813eJake Slack { 85703928aee4356845252ac6b662d5c72c29903813eJake Slack return _cookieConfig; 85803928aee4356845252ac6b662d5c72c29903813eJake Slack } 85903928aee4356845252ac6b662d5c72c29903813eJake Slack 86003928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 86103928aee4356845252ac6b662d5c72c29903813eJake Slack private SessionCookieConfig _cookieConfig = 86203928aee4356845252ac6b662d5c72c29903813eJake Slack new SessionCookieConfig() 86303928aee4356845252ac6b662d5c72c29903813eJake Slack { 86403928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 86503928aee4356845252ac6b662d5c72c29903813eJake Slack public String getComment() 86603928aee4356845252ac6b662d5c72c29903813eJake Slack { 86703928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionComment; 86803928aee4356845252ac6b662d5c72c29903813eJake Slack } 86903928aee4356845252ac6b662d5c72c29903813eJake Slack 87003928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 87103928aee4356845252ac6b662d5c72c29903813eJake Slack public String getDomain() 87203928aee4356845252ac6b662d5c72c29903813eJake Slack { 87303928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionDomain; 87403928aee4356845252ac6b662d5c72c29903813eJake Slack } 87503928aee4356845252ac6b662d5c72c29903813eJake Slack 87603928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 87703928aee4356845252ac6b662d5c72c29903813eJake Slack public int getMaxAge() 87803928aee4356845252ac6b662d5c72c29903813eJake Slack { 87903928aee4356845252ac6b662d5c72c29903813eJake Slack return _maxCookieAge; 88003928aee4356845252ac6b662d5c72c29903813eJake Slack } 88103928aee4356845252ac6b662d5c72c29903813eJake Slack 88203928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 88303928aee4356845252ac6b662d5c72c29903813eJake Slack public String getName() 88403928aee4356845252ac6b662d5c72c29903813eJake Slack { 88503928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionCookie; 88603928aee4356845252ac6b662d5c72c29903813eJake Slack } 88703928aee4356845252ac6b662d5c72c29903813eJake Slack 88803928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 88903928aee4356845252ac6b662d5c72c29903813eJake Slack public String getPath() 89003928aee4356845252ac6b662d5c72c29903813eJake Slack { 89103928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionPath; 89203928aee4356845252ac6b662d5c72c29903813eJake Slack } 89303928aee4356845252ac6b662d5c72c29903813eJake Slack 89403928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 89503928aee4356845252ac6b662d5c72c29903813eJake Slack public boolean isHttpOnly() 89603928aee4356845252ac6b662d5c72c29903813eJake Slack { 89703928aee4356845252ac6b662d5c72c29903813eJake Slack return _httpOnly; 89803928aee4356845252ac6b662d5c72c29903813eJake Slack } 89903928aee4356845252ac6b662d5c72c29903813eJake Slack 90003928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 90103928aee4356845252ac6b662d5c72c29903813eJake Slack public boolean isSecure() 90203928aee4356845252ac6b662d5c72c29903813eJake Slack { 90303928aee4356845252ac6b662d5c72c29903813eJake Slack return _secureCookies; 90403928aee4356845252ac6b662d5c72c29903813eJake Slack } 90503928aee4356845252ac6b662d5c72c29903813eJake Slack 90603928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 90703928aee4356845252ac6b662d5c72c29903813eJake Slack public void setComment(String comment) 90803928aee4356845252ac6b662d5c72c29903813eJake Slack { 90903928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionComment = comment; 91003928aee4356845252ac6b662d5c72c29903813eJake Slack } 91103928aee4356845252ac6b662d5c72c29903813eJake Slack 91203928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 91303928aee4356845252ac6b662d5c72c29903813eJake Slack public void setDomain(String domain) 91403928aee4356845252ac6b662d5c72c29903813eJake Slack { 91503928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionDomain=domain; 91603928aee4356845252ac6b662d5c72c29903813eJake Slack } 91703928aee4356845252ac6b662d5c72c29903813eJake Slack 91803928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 91903928aee4356845252ac6b662d5c72c29903813eJake Slack public void setHttpOnly(boolean httpOnly) 92003928aee4356845252ac6b662d5c72c29903813eJake Slack { 92103928aee4356845252ac6b662d5c72c29903813eJake Slack _httpOnly=httpOnly; 92203928aee4356845252ac6b662d5c72c29903813eJake Slack } 92303928aee4356845252ac6b662d5c72c29903813eJake Slack 92403928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 92503928aee4356845252ac6b662d5c72c29903813eJake Slack public void setMaxAge(int maxAge) 92603928aee4356845252ac6b662d5c72c29903813eJake Slack { 92703928aee4356845252ac6b662d5c72c29903813eJake Slack _maxCookieAge=maxAge; 92803928aee4356845252ac6b662d5c72c29903813eJake Slack } 92903928aee4356845252ac6b662d5c72c29903813eJake Slack 93003928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 93103928aee4356845252ac6b662d5c72c29903813eJake Slack public void setName(String name) 93203928aee4356845252ac6b662d5c72c29903813eJake Slack { 93303928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionCookie=name; 93403928aee4356845252ac6b662d5c72c29903813eJake Slack } 93503928aee4356845252ac6b662d5c72c29903813eJake Slack 93603928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 93703928aee4356845252ac6b662d5c72c29903813eJake Slack public void setPath(String path) 93803928aee4356845252ac6b662d5c72c29903813eJake Slack { 93903928aee4356845252ac6b662d5c72c29903813eJake Slack _sessionPath=path; 94003928aee4356845252ac6b662d5c72c29903813eJake Slack } 94103928aee4356845252ac6b662d5c72c29903813eJake Slack 94203928aee4356845252ac6b662d5c72c29903813eJake Slack @Override 94303928aee4356845252ac6b662d5c72c29903813eJake Slack public void setSecure(boolean secure) 94403928aee4356845252ac6b662d5c72c29903813eJake Slack { 94503928aee4356845252ac6b662d5c72c29903813eJake Slack _secureCookies=secure; 94603928aee4356845252ac6b662d5c72c29903813eJake Slack } 94703928aee4356845252ac6b662d5c72c29903813eJake Slack 94803928aee4356845252ac6b662d5c72c29903813eJake Slack }; 94903928aee4356845252ac6b662d5c72c29903813eJake Slack 95003928aee4356845252ac6b662d5c72c29903813eJake Slack 95103928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 95203928aee4356845252ac6b662d5c72c29903813eJake Slack /** 95303928aee4356845252ac6b662d5c72c29903813eJake Slack * @return total amount of time all sessions remained valid 95403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 95503928aee4356845252ac6b662d5c72c29903813eJake Slack public long getSessionTimeTotal() 95603928aee4356845252ac6b662d5c72c29903813eJake Slack { 95703928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionTimeStats.getTotal(); 95803928aee4356845252ac6b662d5c72c29903813eJake Slack } 95903928aee4356845252ac6b662d5c72c29903813eJake Slack 96003928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 96103928aee4356845252ac6b662d5c72c29903813eJake Slack /** 96203928aee4356845252ac6b662d5c72c29903813eJake Slack * @return mean amount of time session remained valid 96303928aee4356845252ac6b662d5c72c29903813eJake Slack */ 96403928aee4356845252ac6b662d5c72c29903813eJake Slack public double getSessionTimeMean() 96503928aee4356845252ac6b662d5c72c29903813eJake Slack { 96603928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionTimeStats.getMean(); 96703928aee4356845252ac6b662d5c72c29903813eJake Slack } 96803928aee4356845252ac6b662d5c72c29903813eJake Slack 96903928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 97003928aee4356845252ac6b662d5c72c29903813eJake Slack /** 97103928aee4356845252ac6b662d5c72c29903813eJake Slack * @return standard deviation of amount of time session remained valid 97203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 97303928aee4356845252ac6b662d5c72c29903813eJake Slack public double getSessionTimeStdDev() 97403928aee4356845252ac6b662d5c72c29903813eJake Slack { 97503928aee4356845252ac6b662d5c72c29903813eJake Slack return _sessionTimeStats.getStdDev(); 97603928aee4356845252ac6b662d5c72c29903813eJake Slack } 97703928aee4356845252ac6b662d5c72c29903813eJake Slack 97803928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 97903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 98003928aee4356845252ac6b662d5c72c29903813eJake Slack * @see org.eclipse.jetty.server.SessionManager#isCheckingRemoteSessionIdEncoding() 98103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 98203928aee4356845252ac6b662d5c72c29903813eJake Slack public boolean isCheckingRemoteSessionIdEncoding() 98303928aee4356845252ac6b662d5c72c29903813eJake Slack { 98403928aee4356845252ac6b662d5c72c29903813eJake Slack return _checkingRemoteSessionIdEncoding; 98503928aee4356845252ac6b662d5c72c29903813eJake Slack } 98603928aee4356845252ac6b662d5c72c29903813eJake Slack 98703928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 98803928aee4356845252ac6b662d5c72c29903813eJake Slack /** 98903928aee4356845252ac6b662d5c72c29903813eJake Slack * @see org.eclipse.jetty.server.SessionManager#setCheckingRemoteSessionIdEncoding(boolean) 99003928aee4356845252ac6b662d5c72c29903813eJake Slack */ 99103928aee4356845252ac6b662d5c72c29903813eJake Slack public void setCheckingRemoteSessionIdEncoding(boolean remote) 99203928aee4356845252ac6b662d5c72c29903813eJake Slack { 99303928aee4356845252ac6b662d5c72c29903813eJake Slack _checkingRemoteSessionIdEncoding=remote; 99403928aee4356845252ac6b662d5c72c29903813eJake Slack } 99503928aee4356845252ac6b662d5c72c29903813eJake Slack 99603928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 99703928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 99803928aee4356845252ac6b662d5c72c29903813eJake Slack /* ------------------------------------------------------------ */ 99903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 100003928aee4356845252ac6b662d5c72c29903813eJake Slack * Interface that any session wrapper should implement so that 100103928aee4356845252ac6b662d5c72c29903813eJake Slack * SessionManager may access the Jetty session implementation. 100203928aee4356845252ac6b662d5c72c29903813eJake Slack * 100303928aee4356845252ac6b662d5c72c29903813eJake Slack */ 100403928aee4356845252ac6b662d5c72c29903813eJake Slack public interface SessionIf extends HttpSession 100503928aee4356845252ac6b662d5c72c29903813eJake Slack { 100603928aee4356845252ac6b662d5c72c29903813eJake Slack public AbstractSession getSession(); 100703928aee4356845252ac6b662d5c72c29903813eJake Slack } 100803928aee4356845252ac6b662d5c72c29903813eJake Slack 100903928aee4356845252ac6b662d5c72c29903813eJake Slack public void doSessionAttributeListeners(AbstractSession session, String name, Object old, Object value) 101003928aee4356845252ac6b662d5c72c29903813eJake Slack { 101103928aee4356845252ac6b662d5c72c29903813eJake Slack if (!_sessionAttributeListeners.isEmpty()) 101203928aee4356845252ac6b662d5c72c29903813eJake Slack { 101303928aee4356845252ac6b662d5c72c29903813eJake Slack HttpSessionBindingEvent event=new HttpSessionBindingEvent(session,name,old==null?value:old); 101403928aee4356845252ac6b662d5c72c29903813eJake Slack 101503928aee4356845252ac6b662d5c72c29903813eJake Slack for (HttpSessionAttributeListener l : _sessionAttributeListeners) 101603928aee4356845252ac6b662d5c72c29903813eJake Slack { 101703928aee4356845252ac6b662d5c72c29903813eJake Slack if (old==null) 101803928aee4356845252ac6b662d5c72c29903813eJake Slack l.attributeAdded(event); 101903928aee4356845252ac6b662d5c72c29903813eJake Slack else if (value==null) 102003928aee4356845252ac6b662d5c72c29903813eJake Slack l.attributeRemoved(event); 102103928aee4356845252ac6b662d5c72c29903813eJake Slack else 102203928aee4356845252ac6b662d5c72c29903813eJake Slack l.attributeReplaced(event); 102303928aee4356845252ac6b662d5c72c29903813eJake Slack } 102403928aee4356845252ac6b662d5c72c29903813eJake Slack } 102503928aee4356845252ac6b662d5c72c29903813eJake Slack } 102603928aee4356845252ac6b662d5c72c29903813eJake Slack} 1027