我们都知道Session存放在服务器端, cookie存放在用户端(浏览器管理)。那Session具体存放在服务器的什么位置呢?
本文收集下各个服务器对Session的管理之一:存储方式。
PHP配置文件中session.save_path负责session文件的存放位置。 如果没有配置则不会生成session文件,如果配置的目录session.save_path = "D:/sessionFolder"不存在,也会出错。Warning: session_start() [function.session-start]: open(D:/sessionFolder\sess_e0b64760c92422d81c1d6202b66884f6, O_RDWR) failed: No such file or directory (2) in E:\APMServ5.2.6\www\htdocs\session\index.php on line 13 Warning: Unknown: open(D:/sessionFolder\sess_e0b64760c92422d81c1d6202b66884f6, O_RDWR) failed: No such file or directory (2) in Unknown on line 0 Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (D:/sessionFolder) in Unknown on line 0
php会话控制-session: http://www.gwalker.cn/article-121-cmd
apache有个扩展模块用来支持session(mod_session)。session的一些特性和管理又被分割到子模块中。(mod_session_cookie, mod_session_crypto, mod_session_dbd)。通过这些模块可以配置Session存储到数据库中或者内存中或者依赖cookie.
具体示例可以参考官方文档:apache Module mod_session 以及Apache Module mod_session_dbd.
一段数据库存储的示例。
Sample DBD configuration DBDriver pgsql DBDParams "dbname=apachesession user=apache password=xxxxx host=localhost" DBDPrepareSQL "delete from session where key = %s" deletesession DBDPrepareSQL "update session set value = %s, expiry = %lld, key = %s where key = %s" updatesession DBDPrepareSQL "insert into session (value, expiry, key) values (%s, %lld, %s)" insertsession DBDPrepareSQL "select value from session where key = %s and (expiry = 0 or expiry > %lld)" selectsession DBDPrepareSQL "delete from session where expiry != 0 and expiry < %lld" cleansession
1. 内存存储 Memory (single-server, non-replicated) 2. 文件系统持久化策略 File system persistence 3. JDBC持久化策略 JDBC persistence 4. 基于Cookie的Session持久化策略 Cookie-based session persistence 5. 基于内存的可复制Session存储 In-memory replication (across a cluster) Weblogic的session持久化策略是在weblogic.xml的persistent-store-type参数中 指定,缺省状态下为memory,共有如下所列几种选项: * memory—不启用Session持久化. * replicated—跟 memory一样, 但是session数据可以在集群服务器之间复制. * replicated_if_clustered—如果Web应用时部署在一个集群服务器中,是replicated的,否则为memory * async-replicated—异步的session复制 * async-replicated-if-clustered—如果是在集群环境中,启用replicated,否则启用in memory模式。 * async-jdbc—异步的基于jdbc的session持久化 * jdbc—使用数据库来进行session的持久化. * cookie—所有的session数据存储在用户端的cookie中.
Session的持久化是由Session Manager来管理的,Tomcat提供了两个实现类: org.apache.catalina.session.StandarManager org.apache.catalina.session.PersistentManager 1、StandarManager是默认的Session Manager。它的实现机制是:当Tomcat服务器关闭或重启,或Web应用被重新加载时,会将内存中所有的HttpSession对象保存到文件系统中,默认的文件路径是:%CATALINA_HOME%\work\Catalina\<applicaton-name>\SESSIONS.ser 重启Tomcat后,Tomcat服务器把SESSIONS.ser中的持久化HttpSession对象加载到内存中。 2、PersistentManager能够把HttpSession对象保存到Session Store中,它提供了比较StandarManager更灵活的管理功能,具有容错能力,控制内存中HttpSession对象的数目等。 Tomcat实现Session Store的接口为org.apache.catalina.session.Store,目前提供了两个实现这一接口的类:org.apache.catalina.session.FileStore和org.apache.catalina.session.JDBCStore。FileStore会将HttpSession对象保存到文件系统中;而JDBCStore则将HttpSession对象保存到数据库表中。
更多配置可以参考 “tomcat配置session持久化”
网上一些非常不错的参考文章: