⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hashsessionmanager.java

📁 是离开的肌肤了卡机是离开的就富利卡及是了的开发及拉考试及的福利科技阿斯利康的肌肤莱卡及时的离开福建阿斯顿发
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
// ========================================================================// 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 + -