Session 的生命周期和工作原理

来源:互联网 发布:驱动软件 知乎 编辑:程序博客网 时间:2024/05/26 17:43

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 不支持跨域名访问。

0 0
原创粉丝点击