Session 的生命周期和工作原理

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。

① cookie 数据存放在客户端的浏览器上,不占用服务器资源; Session 的数据存放在服务器上,消耗内存。
② cookie 不是很安全,别人可以分析存放在本地的 Cookie 进行 Cookie 欺骗。
③ 从存取方式上比较,Cookie 只能保存 ASCII 字符串,也不能直接存取 Java 对象;而 Session 中可以存取任何类型的数据,可看做是一个 Java 容器类。
④ 如果需要长久的记录信息, Cookie 的 maxAge 属性支持这种效果,只需要设置很大的数值就行;而 session 依赖于 JSESSIONID 的 Cookie ,而 Cookie JSESSIONID 的 maxAge 默认设置为 -1,只要关闭了浏览器 session 就会失效。
⑤ Cookie 支持跨域名访问,而 session 不支持跨域名访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值