我们都知道Session存放在服务器端, cookie存放在用户端(浏览器管理)。那Session具体存放在服务器的什么位置呢?

本文收集下各个服务器对Session的管理之一:存储方式。

  1. PHP Session存储位置
  2. Apache Session 存储位置
  3. Weblogic Session存储位置
  4. Tomcat Session存储位置

 PHP 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 存储位置

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

Weblogic Session存储位置

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中.

Tomcat Session存储位置

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持久化

其他话题:

  1. Session 共享 (Session replication): Session会被复制到多个节点中
  2. 粘性Session (Session sticky): Session不会被复制到多个节点中。

 

 

网上一些非常不错的参考文章: 

  1. tomcat apache session粘性配置和session复制配置
  2. Using Web Server Plug-Ins With WebLogic Server
  3. Using the Apache HTTP Server (mod_proxy) as a reverse proxy to a WebLogic Server

发表评论