session自己定义存储。怎样更好地进行session共享;





读tomcat源代码,org.apache.catalina.session.FileStore可知





一、详见:

方法1 public void save(Session session)

try {

            ((StandardSession)session).writeObjectData(oos);

        } finally {

            oos.close();

        }

方法2 public Session load(String id)

    ois = new ObjectInputStream(bis);





    StandardSession session = (StandardSession) manager.createEmptySession();

    session.readObjectData(ois);

    session.setManager(manager);

return (session);

二、在conf/context.xml文件设置:这个是针对全部的项目了。也能够针对详细项目来配置在server.xml中。

打开context.xml,在<Context>节点下加入例如以下<Manager>节点:

<Manager className="org.apache.catalina.session.PersistentManager" >

    debug=0

    saveOnRestart="true"

    maxActiveSession="-1"

    minIdleSwap="-1"

    maxIdleSwap="-1"

    maxIdleBackup="-1"

    <Store className="org.apache.catalina.session.FileStore" directory="../session" />

//这里代表的是文件持久化.也能够自己实现Store

</Manager>

三、源代码见下文

 * Licensed to the Apache Software Foundation (ASF) under one or more









package org.apache.catalina.session;









import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.util.ArrayList;





import javax.servlet.ServletContext;





import org.apache.catalina.Container;

import org.apache.catalina.Context;

import org.apache.catalina.Loader;

import org.apache.catalina.Session;

import org.apache.catalina.util.CustomObjectInputStream;









/**

 * Concrete implementation of the <b>Store</b> interface that utilizes

 * a file per saved Session in a configured directory.  Sessions that are

 * saved are still subject to being expired based on inactivity.

 *

 * @author Craig R. McClanahan

 */

public final class FileStore extends StoreBase {









    // ----------------------------------------------------- Constants









    /**

     * The extension to use for serialized session filenames.

     */

    private static final String FILE_EXT = ".session";









    // ----------------------------------------------------- Instance Variables









    /**

     * The pathname of the directory in which Sessions are stored.

     * This may be an absolute pathname, or a relative path that is

     * resolved against the temporary work directory for this application.

     */

    private String directory = ".";









    /**

     * A File representing the directory in which Sessions are stored.

     */

    private File directoryFile = null;









    /**

     * The descriptive information about this implementation.

     */

    private static final String info = "FileStore/1.0";





    /**

     * Name to register for this Store, used for logging.

     */

    private static final String storeName = "fileStore";





    /**

     * Name to register for the background thread.

     */

    private static final String threadName = "FileStore";









    // ------------------------------------------------------------- Properties









    /**

     * Return the directory path for this Store.

     */

    public String getDirectory() {





        return (directory);





    }









    /**

     * Set the directory path for this Store.

     *

     * @param path The new directory path

     */

    public void setDirectory(String path) {





        String oldDirectory = this.directory;

        this.directory = path;

        this.directoryFile = null;

        support.firePropertyChange("directory", oldDirectory,

                                   this.directory);





    }









    /**

     * Return descriptive information about this Store implementation and

     * the corresponding version number, in the format

     * <code>&lt;description&gt;/&lt;version&gt;</code>.

     */

    @Override

    public String getInfo() {





        return (info);





    }





    /**

     * Return the thread name for this Store.

     */

    public String getThreadName() {

        return(threadName);

    }





    /**

     * Return the name for this Store, used for logging.

     */

    @Override

    public String getStoreName() {

        return(storeName);

    }









    /**

     * Return the number of Sessions present in this Store.

     *

     * @exception IOException if an input/output error occurs

     */

    @Override

    public int getSize() throws IOException {





        // Acquire the list of files in our storage directory

        File file = directory();

        if (file == null) {

            return (0);

        }

        String files[] = file.list();





        // Figure out which files are sessions

        int keycount = 0;

        for (int i = 0; i < files.length; i++) {

            if (files[i].endsWith(FILE_EXT)) {

                keycount++;

            }

        }

        return (keycount);





    }









    // --------------------------------------------------------- Public Methods









    /**

     * Remove all of the Sessions in this Store.

     *

     * @exception IOException if an input/output error occurs

     */

    @Override

    public void clear()

        throws IOException {





        String[] keys = keys();

        for (int i = 0; i < keys.length; i++) {

            remove(keys[i]);

        }





    }









    /**

     * Return an array containing the session identifiers of all Sessions

     * currently saved in this Store.  If there are no such Sessions, a

     * zero-length array is returned.

     *

     * @exception IOException if an input/output error occurred

     */

    @Override

    public String[] keys() throws IOException {





        // Acquire the list of files in our storage directory

        File file = directory();

        if (file == null) {

            return (new String[0]);

        }





        String files[] = file.list();

        

        // Bugzilla 32130

        if((files == null) || (files.length < 1)) {

            return (new String[0]);

        }





        // Build and return the list of session identifiers

        ArrayList<String> list = new ArrayList<String>();

        int n = FILE_EXT.length();

        for (int i = 0; i < files.length; i++) {

            if (files[i].endsWith(FILE_EXT)) {

                list.add(files[i].substring(0, files[i].length() - n));

            }

        }

        return list.toArray(new String[list.size()]);





    }









    /**

     * Load and return the Session associated with the specified session

     * identifier from this Store, without removing it.  If there is no

     * such stored Session, return <code>null</code>.

     *

     * @param id Session identifier of the session to load

     *

     * @exception ClassNotFoundException if a deserialization error occurs

     * @exception IOException if an input/output error occurs

     */

    @Override

    public Session load(String id)

        throws ClassNotFoundException, IOException {





        // Open an input stream to the specified pathname, if any

        File file = file(id);

        if (file == null) {

            return (null);

        }





        if (! file.exists()) {

            return (null);

        }

        if (manager.getContainer().getLogger().isDebugEnabled()) {

            manager.getContainer().getLogger().debug(sm.getString(getStoreName()+".loading",

                             id, file.getAbsolutePath()));

        }





        FileInputStream fis = null;

        BufferedInputStream bis = null;

        ObjectInputStream ois = null;

        Loader loader = null;

        ClassLoader classLoader = null;

        ClassLoader oldThreadContextCL = Thread.currentThread().getContextClassLoader();

        try {

            fis = new FileInputStream(file.getAbsolutePath());

            bis = new BufferedInputStream(fis);

            Container container = manager.getContainer();

            if (container != null)

                loader = container.getLoader();

            if (loader != null)

                classLoader = loader.getClassLoader();

            if (classLoader != null) {

                Thread.currentThread().setContextClassLoader(classLoader);

                ois = new CustomObjectInputStream(bis, classLoader);

            } else {

                ois = new ObjectInputStream(bis);

            }





            StandardSession session =

                    (StandardSession) manager.createEmptySession();

            session.readObjectData(ois);

            session.setManager(manager);

            return (session);

        } catch (FileNotFoundException e) {

            if (manager.getContainer().getLogger().isDebugEnabled())

                manager.getContainer().getLogger().debug("No persisted data file found");

            return (null);

        } catch (IOException e) {

            if (bis != null) {

                try {

                    bis.close();

                } catch (IOException f) {

                    // Ignore

                }

            }

            if (fis != null) {

                try {

                    fis.close();

                } catch (IOException f) {

                    // Ignore

                }

            }

            throw e;

        } finally {

            if (ois != null) {

                // Close the input stream

                try {

                    ois.close();

                } catch (IOException f) {

                    // Ignore

                }

            }

            Thread.currentThread().setContextClassLoader(oldThreadContextCL);

        }

    }









    /**

     * Remove the Session with the specified session identifier from

     * this Store, if present.  If no such Session is present, this method

     * takes no action.

     *

     * @param id Session identifier of the Session to be removed

     *

     * @exception IOException if an input/output error occurs

     */

    @Override

    public void remove(String id) throws IOException {





        File file = file(id);

        if (file == null) {

            return;

        }

        if (manager.getContainer().getLogger().isDebugEnabled()) {

            manager.getContainer().getLogger().debug(sm.getString(getStoreName()+".removing",

                             id, file.getAbsolutePath()));

        }

        file.delete();





    }









    /**

     * Save the specified Session into this Store.  Any previously saved

     * information for the associated session identifier is replaced.

     *

     * @param session Session to be saved

     *

     * @exception IOException if an input/output error occurs

     */

    @Override

    public void save(Session session) throws IOException {





        // Open an output stream to the specified pathname, if any

        File file = file(session.getIdInternal());

        if (file == null) {

            return;

        }

        if (manager.getContainer().getLogger().isDebugEnabled()) {

            manager.getContainer().getLogger().debug(sm.getString(getStoreName()+".saving",

                             session.getIdInternal(), file.getAbsolutePath()));

        }

        FileOutputStream fos = null;

        ObjectOutputStream oos = null;

        try {

            fos = new FileOutputStream(file.getAbsolutePath());

            oos = new ObjectOutputStream(new BufferedOutputStream(fos));

        } catch (IOException e) {

            if (fos != null) {

                try {

                    fos.close();

                } catch (IOException f) {

                    // Ignore

                }

            }

            throw e;

        }





        try {

            ((StandardSession)session).writeObjectData(oos);

        } finally {

            oos.close();

        }





    }









    // -------------------------------------------------------- Private Methods









    /**

     * Return a File object representing the pathname to our

     * session persistence directory, if any.  The directory will be

     * created if it does not already exist.

     */

    private File directory() throws IOException {





        if (this.directory == null) {

            return (null);

        }

        if (this.directoryFile != null) {

            // NOTE:  Race condition is harmless, so do not synchronize

            return (this.directoryFile);

        }

        File file = new File(this.directory);

        if (!file.isAbsolute()) {

            Container container = manager.getContainer();

            if (container instanceof Context) {

                ServletContext servletContext =

                    ((Context) container).getServletContext();

                File work = (File)

                    servletContext.getAttribute(ServletContext.TEMPDIR);

                file = new File(work, this.directory);

            } else {

                throw new IllegalArgumentException

                    ("Parent Container is not a Context");

            }

        }

        if (!file.exists() || !file.isDirectory()) {

            if (!file.delete() && file.exists()) {

                throw new IOException(

                        sm.getString("fileStore.deleteFailed", file));

            }

            if (!file.mkdirs() && !file.isDirectory()) {

                throw new IOException(

                        sm.getString("fileStore.createFailed", file));

            }

        }

        this.directoryFile = file;

        return (file);





    }









    /**

     * Return a File object representing the pathname to our

     * session persistence file, if any.

     *

     * @param id The ID of the Session to be retrieved. This is

     *    used in the file naming.

     */

    private File file(String id) throws IOException {





        if (this.directory == null) {

            return (null);

        }

        String filename = id + FILE_EXT;

        File file = new File(directory(), filename);

        return (file);





    }









}

session自己定义存储,怎样更好地进行session共享;读tomcat7源代码,org.apache.catalina.session.FileStore可知的更多相关文章

  1. org.apache.catalina.session.StandardManager doLoad

    转载自:http://www.cnblogs.com/java727/p/3300613.html SEVERE: IOException while loading persisted sessio ...

  2. PHP SESSION机制,从存储到读取

    PHP中,如果要获取SESSION数据,必须要有对应的session_id,session_id的获取方式有两种 1.基于客户端的cookie 2.基于url 先说第一种情况,基于客户端的cookie ...

  3. tomcat启动报错 ERROR o.a.catalina.session.StandardManager 182 - Exception loading sessions from persiste

    系统:centos6.5 x86_64 jdk: 1.8.0_102 tomcat:8.0.37 tomcat 启动报错: ERROR o.a.catalina.session.StandardMan ...

  4. org.apache.shiro.session.InvalidSessionException: java.lang.IllegalStateException: getAttribute: Session already invalidated] with root cause

    1.遇到以下异常,找了好长时间,终于解决,报的异常如下: 七月 07, 2017 3:02:16 下午 org.apache.catalina.core.StandardWrapperValve in ...

  5. PHP临时文件session的分级存储与定期删除

    在Windows上PHP默认的Session服务端文件存放在C:\WINDOWS\Temp下,如果说并发访问很大或者 session建立太多,目录下就会存在大量类似sess_xxxxxx的sessio ...

  6. php之memcached存储session配置、存储、获取

    [session] ①.session.save_handler = memcache session.save_handler 定义了来存储和获取与会话关联的数据的处理器的名字,默认是files ② ...

  7. .net的session详解 存储模式 存到数据库中 使用范围与大小限制 生命周期

    Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息.举个例子来说,我们可以把已登录用户的用户名放在Session中,这样就能通过判断Session中的某个 ...

  8. PPT | Docker定义存储-让应用无痛运行

    编者注: 本文为9月27日晚上8点有容云平台存储架构师张朝潞在腾讯课堂中演讲的PPT,本次课堂为有容云主办的线上直播Docker Live时代●Online Meetup-第三期:Docker定义存储 ...

  9. 网络:Session原理及存储

    一.Session的工作流程 二.会话保持 会话保持是负载均衡最常见的问题之一,会话保持是指在负载均衡器上实现的一种机制,可以识别客户端与服务器之间交互过程的关连性,在作负载均衡的同时还保证一系列相关 ...

随机推荐

  1. AC日记——太空飞行计划 洛谷 P2762

    题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的 ...

  2. AC日记——爱改名的小融3 codevs 3156

    3156 爱改名的小融 3  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description Wikioi上有个人叫小融,他喜 ...

  3. 在线扩展根分区 red hat 4.8.3-9

    跑程序的时候发现报错,提示空间不足,仔细查看后发现是根分区已满 27G的空间只有20k剩余 考虑从/data分区压缩一点空间到/分区 切换到root用户 执行下面的命令 1. umount /data ...

  4. React项目的打包与部署到腾讯云

    腾讯云送了30天的免费试用,于是有了把react项目部署到上面的想法.项目是默认生成的,只是一个页面,但是这个过程中也遇到了不少麻烦与问题.下面来具体梳理下: create-react-app 来自F ...

  5. http错误种类及原因

    http://blog.csdn.net/dxykevin/article/details/50950878 [摘要]HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应 ...

  6. zookeeper源码 — 四、session建立

    目录 session建立的主要过程 客户端发起连接 服务端创建session session建立的主要过程 用一张图来说明session建立过程中client和server的交互 主要流程 服务端启动 ...

  7. BZOJ——1620: [Usaco2008 Nov]Time Management 时间管理

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 920  Solved: 569[Submit][Status][Discuss] Description ...

  8. git移除上一次的commit中误添加的文件

    在使用git进行版本管理时,往往会出现一些误操作,比如将一些不加上传的文件放到了暂存区,即上传到了上一次commit中 比如: commit c134ab90ca7c4daf8bfa22e3ad706 ...

  9. Codechef FNCS Chef and Churu

    Disciption Chef has recently learnt Function and Addition. He is too exited to teach this to his fri ...

  10. trick点

    1.问题里有取模操作的时候,最后输出(ans+mod)%mod 2.涉及到输出实数0的时候要特判输出的会不是是-0.000000(因为0.00乘一个负的浮点数结果是-0.000000,乘一个正的浮点数 ...