• session的使用


    一、什么是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();

      本着总结分享学习经验的原则,如有不对请指正

    人真是奇怪,非得走到最后一步,是不会觉悟的。但是到了最后一步,又觉得太晚了。
  • 相关阅读:
    (转)Javascript如何正确使用getElementById,getElementsByName() and getElementsByTagName()
    把一个json字符串转换成对应的c#类型
    (转)C#数字转固定长度的字符串
    WDBuyNET.DMSFrame.DMSLinq内部方法
    (Transfered)DOM最常用的方法和属性(Javascript DOM编程艺术,DOM Scripting)
    三星颁布发表供应多款Android手机全新晋级
    APNIC执委赵巍:IPv4向IPv6过渡再无退路
    谷歌Android操纵市廛下架染辣手机软件
    盗窟手机小我私人撤军华强北:市场一年不如一年
    华为“黑室”命系商务部防线
  • 原文地址:https://www.cnblogs.com/boWatermelon/p/6622418.html
Copyright © 2020-2023  润新知