Session

Session简介

  Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。

  Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

  如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

Session与Cookie的不同点

  与Cookie相似,Session是另一种记录用户状态的机制。但是与其不同之处在于:

  • Cookie是将用户的信息记录在本地,而Session是将用户的信息记录在web服务器中;

  • 不像Cookie那样对存入数据的类型只能限制为有限大小的字符串(大小不能超过4KB),而Session则没有这样的限制,由于Session中存入的内容是Object类型,因而它可以存储任何形式的数据,无论是字符串还是对象,而且其大小也没有相应的限制。

Session的工作原理

  服务器是在电泳HttpServletRequest的getSession()方法来创建Session对象的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;而该Session id将会在用户的浏览器中以JSESSIONID的形式存储在本地的Cookie中。当客户端再次发送请求的时候,会将这个JSESSIONID带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。

Session的生命周期

  Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。

  Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。

  Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

Session的有效时间配置

  由于Session是存储于服务器中的用户信息,因而当用户访问量不断增大时,其对系统是十份吃资源的,而用户浏览器的退出,其并不向服务器中发送相应的信息,因而服务器其实是不知道用户是何时退出的,这样一来服务器就会积累大量不必要的Session信息,而要避免这一问题,最好的办法就是定时清除服务器中的Session信息。因而我们会需要配置相应的Session有效时间。Session的配置一共有三种方式,分别为在Tomcat,在Servlet以及在用户的application中。

在Tomcat中的配置

  Session在Tomcat中的配置只能精确到分,在默认的情况下Tomcat中就配置着Session的过期时间为30分钟,如下,该配置信息在Tomcat的web.xml文件中:

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

在Servlet中的配置

  Session在Servlet中的配置地点在web.xml中,添加方式同Tomcat相同,如下:

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

在用户的application中

  在用户的application中,我们是通过HttpServletRequest中的getSession()方法来获取session,然后在Session中通过setMaxInactiveInterval()方法设置有效时间,其中时间的设置精度为秒。

  但是这里需要指出的是,由于我在程序中设置的有效时间为60秒,但是,实际上程序在执行中,真正的有效时间每次都多少有些不同,时间从88秒到111秒之间不等,也可能出现其它的时间,但是不会小于自定义的60秒,初步推测,Session的失效时间与JVM的垃圾回收机制有关,同时这也可以说明,为什么Tomcat中的回收时间精度为分钟,其实当精度设置为秒时,我们是不能真正达到该精度的。

HttpSession session = request.getSession();
session.setMaxInactiveInterval(60);

Session的接口源码

  在Session的接口源码中,其中已经给我们列出了Session操作的所有可能的方法,我们只需要按照其源码提供的接口进行调用就可以了。

package javax.servlet.http;

import java.util.Enumeration;
import javax.servlet.ServletContext;

public interface HttpSession {
    long getCreationTime();

    String getId();

    long getLastAccessedTime();

    ServletContext getServletContext();

    void setMaxInactiveInterval(int var1);

    int getMaxInactiveInterval();

    /** @deprecated */
    HttpSessionContext getSessionContext();

    Object getAttribute(String var1);

    /** @deprecated */
    Object getValue(String var1);

    Enumeration getAttributeNames();

    /** @deprecated */
    String[] getValueNames();

    void setAttribute(String var1, Object var2);

    /** @deprecated */
    void putValue(String var1, Object var2);

    void removeAttribute(String var1);

    /** @deprecated */
    void removeValue(String var1);

    void invalidate();

    boolean isNew();
}

在浏览器中获取Session id(JSESSIONID)

  在浏览器中获取session的方法如下:

<script>document.write(document.cookie);</script>

  但是需要注意的是,由于现在绝大多数的浏览器都在过滤JSESSIONID的Cookie信息,所以说我们通过上述语句在页面中展示时是看不到JSESSIONID的,如下的在360急速浏览器中显示的结果:

这里写图片描述

  在上述结果中,我们在页面中就没有看到名为JSESSIONID的Cookie,但是实际上该信息是存在的,在浏览器的控制台中查看如下:

这里写图片描述

参考文献:
  session
  理解Cookie和Session机制

源码:
  session-demo1


  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值