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