//
// ========================================================================
// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.server.session;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.http.HttpServletRequest;
import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.annotation.ManagedOperation;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.statistic.CounterStatistic;
DefaultSessionCache
A session store that keeps its sessions in memory in a hashmap
/**
* DefaultSessionCache
*
* A session store that keeps its sessions in memory in a hashmap
*/
@ManagedObject
public class DefaultSessionCache extends AbstractSessionCache
{
private static final Logger LOG = Log.getLogger("org.eclipse.jetty.server.session");
The cache of sessions in a hashmap
/**
* The cache of sessions in a hashmap
*/
protected ConcurrentHashMap<String, Session> _sessions = new ConcurrentHashMap<>();
private final CounterStatistic _stats = new CounterStatistic();
Params: - manager – The SessionHandler related to this SessionCache
/**
* @param manager The SessionHandler related to this SessionCache
*/
public DefaultSessionCache(SessionHandler manager)
{
super(manager);
}
Returns: the number of sessions in the cache
/**
* @return the number of sessions in the cache
*/
@ManagedAttribute(value = "current sessions in cache", readonly = true)
public long getSessionsCurrent()
{
return _stats.getCurrent();
}
Returns: the max number of sessions in the cache
/**
* @return the max number of sessions in the cache
*/
@ManagedAttribute(value = "max sessions in cache", readonly = true)
public long getSessionsMax()
{
return _stats.getMax();
}
Returns: a running total of sessions in the cache
/**
* @return a running total of sessions in the cache
*/
@ManagedAttribute(value = "total sessions in cache", readonly = true)
public long getSessionsTotal()
{
return _stats.getTotal();
}
/**
*
*/
@ManagedOperation(value = "reset statistics", impact = "ACTION")
public void resetStats()
{
_stats.reset();
}
See Also: - doGet.doGet(String)
/**
* @see org.eclipse.jetty.server.session.AbstractSessionCache#doGet(java.lang.String)
*/
@Override
public Session doGet(String id)
{
if (id == null)
return null;
Session session = _sessions.get(id);
return session;
}
See Also: - doPutIfAbsent.doPutIfAbsent(String, Session)
/**
* @see org.eclipse.jetty.server.session.AbstractSessionCache#doPutIfAbsent(java.lang.String, org.eclipse.jetty.server.session.Session)
*/
@Override
public Session doPutIfAbsent(String id, Session session)
{
Session s = _sessions.putIfAbsent(id, session);
if (s == null && !(session instanceof PlaceHolderSession))
_stats.increment();
return s;
}
See Also: - doDelete.doDelete(String)
/**
* @see org.eclipse.jetty.server.session.AbstractSessionCache#doDelete(java.lang.String)
*/
@Override
public Session doDelete(String id)
{
Session s = _sessions.remove(id);
if (s != null && !(s instanceof PlaceHolderSession))
_stats.decrement();
return s;
}
@Override
public void shutdown()
{
// loop over all the sessions in memory (a few times if necessary to catch sessions that have been
// added while we're running
int loop = 100;
while (!_sessions.isEmpty() && loop-- > 0)
{
for (Session session : _sessions.values())
{
//if we have a backing store so give the session to it to write out if necessary
if (_sessionDataStore != null)
{
session.willPassivate();
try
{
_sessionDataStore.store(session.getId(), session.getSessionData());
}
catch (Exception e)
{
LOG.warn(e);
}
doDelete(session.getId()); //remove from memory
session.setResident(false);
}
else
{
//not preserving sessions on exit
try
{
session.invalidate();
}
catch (Exception e)
{
LOG.ignore(e);
}
}
}
}
}
See Also: - newSession.newSession(HttpServletRequest, SessionData)
/**
* @see org.eclipse.jetty.server.session.AbstractSessionCache#newSession(javax.servlet.http.HttpServletRequest, org.eclipse.jetty.server.session.SessionData)
*/
@Override
public Session newSession(HttpServletRequest request, SessionData data)
{
Session s = new Session(getSessionHandler(), request, data);
return s;
}
See Also: - newSession.newSession(SessionData)
/**
* @see org.eclipse.jetty.server.session.AbstractSessionCache#newSession(org.eclipse.jetty.server.session.SessionData)
*/
@Override
public Session newSession(SessionData data)
{
Session s = new Session(getSessionHandler(), data);
return s;
}
See Also: - doReplace.doReplace(String, Session, Session)
/**
* @see org.eclipse.jetty.server.session.AbstractSessionCache#doReplace(java.lang.String, org.eclipse.jetty.server.session.Session, org.eclipse.jetty.server.session.Session)
*/
@Override
public boolean doReplace(String id, Session oldValue, Session newValue)
{
boolean result = _sessions.replace(id, oldValue, newValue);
if (result && (oldValue instanceof PlaceHolderSession))
_stats.increment();
return result;
}
}