zoukankan      html  css  js  c++  java
  • Session介绍

    一、Session简单介绍

      在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

    二、Session实现与工作原理

          浏览器和服务器采用http无状态的通讯,为了保持客户端的状态,使用session来达到这个目的。在session机制中,也采用了这样的一个唯一的session_id来标示不同的用户,不同的是:浏览器每次请求都会带上由服务器为它生成的session_id。

         简单介绍一下流程:当客户端访问服务器时,服务器根据需求设置session,将会话信息保存在服务器上,同时将标示session的session_id传递给客户端浏览器,浏览器将这个session_id保存在内存中(还有其他的存储方式,例如写在url中),我们称之为无过期时间的cookie。浏览器关闭后,这个cookie就清掉了,它不会存在用户的cookie临时文件。

         以后浏览器每次请求都会额外加上这个参数值,再服务器根据这个session_id,就能取得客户端的数据状态。
    如果客户端浏览器意外关闭,服务器保存的session数据不是立即释放,此时数据还会存在,只要我们知道那个session_id,就可以继续通过请求获得此session的信息;但是这个时候后台的session还存在,但是session的保存有一个过期时间,一旦超过规定时间没有客户端请求时,他就会清除这个session。

        下面介绍一下session的存储机制,默认的session是保存在files中,即以文件的方式保存session数据。在php中主要根据php.ini的配置session.save_handler来选择保存session的方式。

        这里顺便说明一下,如果要做服务器的lvs,即多台server的话,我们一般使用memcached的方式session,否则会导致一些请求找不到session。

       一个简单的memcache配置:

       session.save_handler = memcache
       session.save_path = "tcp://10.28.41.84:10001"
       当然如果一定要使用files文件缓存,我们可以将文件作nfs,将所有的保存session文件定位到一个地方。
       刚才讲返回给用户的session-id最终保存在内存中,这里我们也可以设置参数将其保存在用户的url中。

    三、session对象的生命周期

    问题:用户开一个浏览器访问一个网站,服务器是不是针对这次会话创建一个session? 
    答:不是的。session的创建时机是在程序中第一次去执行request.getSession();这个代码,服务器才会为你创建session。 
    问题:关闭浏览器,会话结束,session是不是就销毁了呢? 
    答:不是的。session是30分钟没人用了才会死,服务器会自动摧毁session。

    • 在web.xml文件中可以手工配置session的失效时间。例如:

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
        <display-name>day07</display-name>
      
        <!-- 设置Session的有效时间:以分钟为单位-->
        <session-config>
          <session-timeout>10</session-timeout>
        </session-config>
      
        <welcome-file-list>
          <welcome-file>index.html</welcome-file>
          <welcome-file>index.htm</welcome-file>
          <welcome-file>index.jsp</welcome-file>
          <welcome-file>default.html</welcome-file>
          <welcome-file>default.htm</welcome-file>
          <welcome-file>default.jsp</welcome-file>
        </welcome-file-list>
      </web-app>
    • 当需要在程序中手动设置Session失效时,可以手工调用session.invalidate方法,摧毁session。
    • HttpSession session = request.getSession();
      // 手工调用session.invalidate方法,摧毁session
      session.invalidate();

    总结:开一个浏览器访问服务器,第一次去执行request.getSession();那个代码,服务器为你创建session。然后故意不关闭浏览器,跑去玩了1个小时,session也没了,即使会话没结束,服务器发现session没人用也会将其摧毁掉。

    四、session对象的创建和销毁时机

    session对象的创建时机:在程序中第一次调用request.getSession()方法时就会创建一个新的Session,可以用isNew()方法来判断Session是不是新创建的。

    session对象的销毁时机:session对象默认30分钟没有使用,则服务器会自动销毁session,在web.xml文件中可以手工配置session的失效时间。

    五、session和Cookie的主要区别

    • Cookie是把用户的数据写给用户的浏览器。
    • Session技术把用户的数据写到用户独占的session中。
    • Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。  

    参照于文章:https://www.cnblogs.com/xdp-gacl/p/3855702.html

  • 相关阅读:
    Maven报错找不到jre
    SpringBoot学习记(一)第一个SpringBoot Web服务
    (转!)大话websocket
    (转!)Netdata---Linux系统性能实时监控平台部署
    Jmeter(四十三)WebSocket Sampler 和 Ajax Request
    Jmeter(四十二)Jmeter工作原理
    Centos7安装docker(转!)
    es6 数组去重
    数组对象根据某个值相同合并分组
    await在forEach不起作用解决【await is a reserved word】
  • 原文地址:https://www.cnblogs.com/jk-heart/p/8646939.html
Copyright © 2011-2022 走看看