Session介绍和使用

来源:互联网 发布:matlab 遗传算法 编辑:程序博客网 时间:2024/06/03 14:17
一、什么是session?

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

      sessionid 当你第一次访问一个网站的时候,网站服务器会在响应头内加上Set-Cookie JSESSIONID=  nj1tvkclp3jh 83olcn3191sjq3(java服务器)信息,此信息是服务器随机生成的,放在服务器内存里,为了标识唯一的客户端用户,内容不会重复,这就是sessionid.

二、session的工作原理


1、session的生命周期

 

  • 客户首次访问服务器的一个页面时,服务器就会为该用户分配一个session对象,同时为这个session指定唯一的ID,并且将该ID发送到客户端并写入到cookie中,使得客户端与服务器的session建立一一对应的关系; 
  • 当客户端继续访问服务器端的其它资源时,服务器不再为该客户分配新的session对象,直到客户端浏览器关闭、超时或调用session的invalidate()方法使其失效,客户端与服务器的会话结束。 
  • 当客户重新打开浏览器访问网站时,服务器会重新为客户分配一个session对象,并重新分配sessionID。
  • 2、session失效的原因

  • session本身有一个存活时间,在tomcat中默认的是30分钟,和浏览器是没有关系的,因为即使你浏览器一直开着,如果在30分钟内没有发出任何请求,那你原来存在服务器上的session域内的东西就全没有了,你再次访问的时候,服务器会新建一个session的。通过session的ID来判断是不是新的session,session时间的改变是通过session.getMaxInactiveInterval()改变的。
  • 调用invalidate()
  • 服务器重启或者中断
  • 注意:

           浏览器会将sessionid放在自己的进程内存里,这里不同的浏览器会有所不同,IE进程间不能共享这个sessionid,也就是新开一个IE将不能共享这个sessionid;而Firefox进程间可以共享.然后你继续发请求给这个网站的时候,浏览器就会把这个sessionid放在请求头里发送给该服务器了,这样服务器得到sessionid后再和自己内存里存放的sessionid对比锁定客户端,从而区分不同客户端,完成会话.

           可以看出如果用这种方式,当用户在会话的过程中关闭浏览器结束进程,则这个session将消失,如果用户又打开浏览器想继续这次会话的时候,就会因为发送的请求中没有这个sessionid而使服务器无法辨别该把那个session信息给他,注意(这个时候服务器端的sessionid和sessionid所指向的session都还存在,只是没有正确的sessionid和它匹配而占用服务器内存,只有session过期或服务器重启才释放内存).

    三、session的使用


    1、session的方法

    • public void setAttribute(String name,String value)设定指定名字的属性的值。
    • public Object getAttribute(String name)在会话范围内获取指定名字的属性的值。
    • public void removeAttribute(String name),删除指定名字的session属性,若该属性不存在,则出现异常。  
    • public void invalidate(),使session失效。可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问。  
    • public String getId( ),获取当前的会话ID。每个会话在服务器端都存在一个唯一的标示sessionID,session对象发送到浏览器的唯一数据就是sessionID,它一般存储在cookie中。  
    • public void setMaxInactiveInterval(int interval) 设置会话的最大持续时间,单位是秒,负数表明会话永不失效。  
    • public int getMaxInActiveInterval(),获取会话的最大持续时间,当值为-1时永远不会失效,只有当服务器重启时才会失效 
    • 使用session对象的getCreationTime()和getLastAccessedTime()方法可以获取会话创建的时间和最后访问的时间,但其返回值是毫秒,一般需要使用下面的转换来获取具体日期和时间。

    2、获得session对象,主要有两个方法

    (1)一是通过HttpServletRequest对象来实现

    • reques.getSession(true)等同于request.getSession();意味着若存在会话,则返回该会话,否则创建  一个新的会话,并返回新创建的会话。
    • request.getSession(false)意味着当若存在该会话则返回该会话,否则返回null。

    注意:session是需要占用服务器资源的,除非会话一定不存在或必须要创建,不然的一般 最好使用request.getSession(false)。在正常情况下可以通过在session中创建一个参数,通过获得该参数是不是为null来判断该会话是否存在。若为null则不存在会话,否则存在。

    复制代码
    private boolean ifExistsSession(HttpServletRequest request) {           HttpSession session = request.getSession(false);     if (session != null) {         //获得sesison中创建的变量         if (session.getAttribute("name") != null) {             return true;        }     }      return false; }                            

     

    复制代码

     

    (2)通过pagecontext对象来xt获取,pageContext.session();

原创粉丝点击