Session 的生命周期
Session 的作用时间从用户第一次到达某个特定的 Web 页开始到用户离开 Web 站点,或在程序中利用代码终止某个 Session,默认过期时间为 30 分钟,可在 Tomcat 的 web.xml 配置文件中查看到如下信息:
可以在 web.xml 重新设置 session 的生命周期,如果在该段时间内没有再次请求,则会自动调用 sessionDestroyed 方法销毁该 session。如果 session 的超时时间设置过长,服务器累积的 session 就会越来越多,容易导致内存溢出。
<session-config>
<session-timeout>1</session-timeout>
</session-config>
超时时间也可以直接在代码中修改:
HttpServletRequest hsr = (HttpServletRequest) request;
//创建一个 Session 对象
HttpSession session = hsr.getSession(true);
//设置超时时间
session.setMaxInactiveInterval(30);
//获取超时时间
int maxInactiveInterval = session.getMaxInactiveInterval();
System.out.println("设置的超时时间:"+maxInactiveInterval);
为了监听 session 的生命周期,可以创建一个 SessionListener 监听器来监听 Session 的生命周期,需实现 SessionListener 接口。
package com.sunsharing.exp01.Listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* Created by Hinbo on 2016/9/2.
* 自定义的 Session 监听器
*/
public class MySessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("Session 创建时:"+httpSessionEvent.getSession().getId());
}
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("Session 销毁时:"+httpSessionEvent.getSession().getId());
}
}
session 的销毁只有两种情况:
① 成功的调用了 session.invalidate() 方法。
② 前后两次请求超出了 session 指定的生命周期时间。
Session 的工作原理
1、当一个用户向服务器发送第一个请求时, 服务器为其建立一个 session,并为该 session 创建一个标识号sessionid。
2、当用户再次请求时,服务器首先检查这个客户端的请求是否包含 sessionid,如果包含就说明之前创建过该 session,服务器就按照这个 sessionid 将该 session 检索出来使用,如果不存在则重新创建一个 session 并为其生成一个与该 session 相匹配的 sessionid。
Session 和 Cookie 的区别
① cookie 数据存放在客户端的浏览器上,不占用服务器资源; Session 的数据存放在服务器上,消耗内存。
② cookie 不是很安全,别人可以分析存放在本地的 Cookie 进行 Cookie 欺骗。
③ 从存取方式上比较,Cookie 只能保存 ASCII 字符串,也不能直接存取 Java 对象;而 Session 中可以存取任何类型的数据,可看做是一个 Java 容器类。
④ 如果需要长久的记录信息, Cookie 的 maxAge 属性支持这种效果,只需要设置很大的数值就行;而 session 依赖于 JSESSIONID 的 Cookie ,而 Cookie JSESSIONID 的 maxAge 默认设置为 -1,只要关闭了浏览器 session 就会失效。
⑤ Cookie 支持跨域名访问,而 session 不支持跨域名访问。