Tomcat Session
Session机制:跟踪用户的状态
Session跟踪的机制:
- 把SessionID保存到客户端Cookie中
- 若浏览器禁止了cookie,可以在每个URL中加上SessionID(重写URL的方法如:response.encodeURL("xxx.jsp");)
session失效时间
1:代码
session.setmaxinactiveinterval(7200);
2:web.xml
<session-config> <session-timeout>24</session-timeout> </session-config>
3:context.xml
<Context path="/livsorder" docBase="/home/httpd/html/livsorder" defaultSessionTimeOut="3600" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false"/>
优先级高到低
Session的持久化是由Session Manager管理的。有两种方式:
- StandardManager -是默认的方法,当Tomcat服务器重启或重载的时候,会把Session对象保存到<%CATALINA_HOME%>/work/Catalina/honstname/applicatonname/SESSIONS.ser(默认值)文件中,每个对象对应一个文件,以Session ID为文件名,例如:
<Context path="/helloapp" docBase="helloapp" debug="0" reloadable="true"><Manager className="org.apache.catalina.session.StandardManager" debug="0" maxActiveSessions="-1" checkInterval="60" /></Context>
- PersistentManager -提供了更加灵活的管理方式,具有容错能力,可以及时把Session备份到Session Store中,可以控制内存中Session的数量。小猫还提供了实现持久化Session Store的接口,org.apache.catalina.Store,目前提供了两个具体实现类:org.apache.catalina.FileStore和org.apache.catalina.JDBCStore。
protected Map<String, Session> sessions = new ConcurrentHashMap<String, Session>();
Tomcat Session共享
一个Tomcat中有多一个web应用,然后想共享session,只需在host中加上
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
session原理:
Session 如何基于 Cookie 来工作。实际上有三种方式能可以让 Session 正常工作:
- 基于 URL Path Parameter,默认就支持
- 基于 Cookie,如果你没有修改 Context 容器个 cookies 标识的话,默认也是支持的
- 基于 SSL,默认不支持,只有 connector.getAttribute("SSLEnabled") 为 TRUE 时才支持
第一种情况下,当浏览器不支持 Cookie 功能时,浏览器会将用户的 SessionCookieName 重写到用户请求的 URL 参数中,它的传递格式如 /path/Servlet;name=value;name2=value2? Name3=value3,其中“Servlet;”后面的 K-V 对就是要传递的 Path Parameters,服务器会从这个 Path Parameters 中拿到用户配置的 SessionCookieName。关于这个 SessionCookieName,如果你在 web.xml 中配置 session-config 配置项的话,其 cookie-config 下的 name 属性就是这个 SessionCookieName 值,如果你没有配置 session-config 配置项,默认的 SessionCookieName 就是大家熟悉的“JSESSIONID”。接着 Request 根据这个 SessionCookieName 到 Parameters 拿到 Session ID 并设置到 request.setRequestedSessionId 中。
请注意如果客户端也支持 Cookie 的话,Tomcat 仍然会解析 Cookie 中的 Session ID,并会覆盖 URL 中的 Session ID。
如果是第三种情况的话将会根据 javax.servlet.request.ssl_session 属性值设置 Session ID。
有了 Session ID 服务器端就可以创建 HttpSession 对象了,第一次触发是通过 request. getSession() 方法,如果当前的 Session ID 还没有对应的 HttpSession 对象那么就创建一个新的,并将这个对象加到 org.apache.catalina. Manager 的 sessions 容器中保存,Manager 类将管理所有 Session 的生命周期,Session 过期将被回收,服务器关闭,Session 将被序列化到磁盘等。只要这个 HttpSession 对象存在,用户就可以根据 Session ID 来获取到这个对象,也就达到了状态的保持。



浙公网安备 33010602011771号