📄 hashsessionmanager.java
字号:
// ========================================================================// Copyright 1996-2005 Mort Bay Consulting Pty. Ltd.// ------------------------------------------------------------------------// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License.// ========================================================================package org.mortbay.jetty.servlet;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Timer;import java.util.TimerTask;import javax.servlet.http.HttpServletRequest;import org.mortbay.log.Log;import org.mortbay.util.LazyList;/* ------------------------------------------------------------ *//** An in-memory implementation of SessionManager. * * @author Greg Wilkins (gregw) */public class HashSessionManager extends AbstractSessionManager{ private Timer _timer; private TimerTask _task; private int _scavengePeriodMs=30000; private int _savePeriodMs=0; //don't do period saves by default private TimerTask _saveTask; protected Map _sessions; private File _storeDir; private boolean _lazyLoad=false; private boolean _sessionsLoaded=false; /* ------------------------------------------------------------ */ public HashSessionManager() { super(); } /* ------------------------------------------------------------ */ /* (non-Javadoc) * @see org.mortbay.jetty.servlet.AbstractSessionManager#doStart() */ public void doStart() throws Exception { _sessions=new HashMap(); super.doStart(); _timer=new Timer(true); setScavengePeriod(getScavengePeriod()); if (_storeDir!=null) { if (!_storeDir.exists()) _storeDir.mkdir(); if (!_lazyLoad) restoreSessions(); } setSavePeriod(getSavePeriod()); } /* ------------------------------------------------------------ */ /* (non-Javadoc) * @see org.mortbay.jetty.servlet.AbstractSessionManager#doStop() */ public void doStop() throws Exception { if (_storeDir != null) saveSessions(); super.doStop(); _sessions.clear(); _sessions=null; // stop the scavenger synchronized(this) { if (_saveTask!=null) _saveTask.cancel(); if (_task!=null) _task.cancel(); if (_timer!=null) _timer.cancel(); _timer=null; } } /* ------------------------------------------------------------ */ /** * @return seconds */ public int getScavengePeriod() { return _scavengePeriodMs/1000; } /* ------------------------------------------------------------ */ public Map getSessionMap() { return Collections.unmodifiableMap(_sessions); } /* ------------------------------------------------------------ */ public int getSessions() { return _sessions.size(); } /* ------------------------------------------------------------ */ public void setMaxInactiveInterval(int seconds) { super.setMaxInactiveInterval(seconds); if (_dftMaxIdleSecs>0&&_scavengePeriodMs>_dftMaxIdleSecs*1000) setScavengePeriod((_dftMaxIdleSecs+9)/10); } public void setSavePeriod (int seconds) { int oldSavePeriod = _savePeriodMs; int period = (seconds * 1000); if (period < 0) period=0; _savePeriodMs=period; if (_timer!=null) { synchronized (this) { if (_saveTask!=null) _saveTask.cancel(); if (_savePeriodMs > 0 && _storeDir!=null) //only save if we have a directory configured { _saveTask = new TimerTask() { public void run() { try { saveSessions(); } catch (Exception e) { Log.warn(e); } } }; _timer.schedule(_saveTask,_savePeriodMs,_savePeriodMs); } } } } public int getSavePeriod () { if (_savePeriodMs<=0) return 0; return _savePeriodMs/1000; } /* ------------------------------------------------------------ */ /** * @param seconds */ public void setScavengePeriod(int seconds) { if (seconds==0) seconds=60; int old_period=_scavengePeriodMs; int period=seconds*1000; if (period>60000) period=60000; if (period<1000) period=1000; _scavengePeriodMs=period; if (_timer!=null && (period!=old_period || _task==null)) { synchronized (this) { if (_task!=null) _task.cancel(); _task = new TimerTask() { public void run() { scavenge(); } }; _timer.schedule(_task,_scavengePeriodMs,_scavengePeriodMs); } } } /* -------------------------------------------------------------- */ /** * Find sessions that have timed out and invalidate them. This runs in the * SessionScavenger thread. */ private void scavenge() { //don't attempt to scavenge if we are shutting down if (isStopping() || isStopped()) return; Thread thread=Thread.currentThread(); ClassLoader old_loader=thread.getContextClassLoader(); try { if (_loader!=null) thread.setContextClassLoader(_loader); long now=System.currentTimeMillis(); try { if (!_sessionsLoaded && _lazyLoad) restoreSessions(); } catch(Exception e) { Log.debug(e); } // Since Hashtable enumeration is not safe over deletes, // we build a list of stale sessions, then go back and invalidate // them Object stale=null; synchronized (HashSessionManager.this) { // For each session for (Iterator i=_sessions.values().iterator(); i.hasNext();) { Session session=(Session)i.next(); long idleTime=session._maxIdleMs; if (idleTime>0&&session._accessed+idleTime<now) { // Found a stale session, add it to the list stale=LazyList.add(stale,session); } } } // Remove the stale sessions for (int i=LazyList.size(stale); i-->0;) { // check it has not been accessed in the meantime Session session=(Session)LazyList.get(stale,i); long idleTime=session._maxIdleMs; if (idleTime>0&&session._accessed+idleTime<System.currentTimeMillis()) { ((Session)session).timeout(); int nbsess=this._sessions.size(); if (nbsess<this._minSessions) this._minSessions=nbsess; } } } catch (Throwable t) { if (t instanceof ThreadDeath) throw ((ThreadDeath)t); else Log.warn("Problem scavenging sessions", t); } finally { thread.setContextClassLoader(old_loader); } } /* ------------------------------------------------------------ */ protected void addSession(AbstractSessionManager.Session session) { _sessions.put(session.getClusterId(),session); } /* ------------------------------------------------------------ */ public AbstractSessionManager.Session getSession(String idInCluster) { try { if (!_sessionsLoaded && _lazyLoad) restoreSessions(); } catch(Exception e)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -