Cookie和Session

会话技术:
  会话:双方的交流或者交互,计算机中也是,浏览器和服务器的交互称之为会话
会话的生命周期:
  开始:
    浏览器访问服务器时会话开始
  结束:
    浏览器或者服务器一方中断时,会话结束
    由于服务器一般一直处于持续运行状态,会话结束一般是浏览器关闭引起的

会话技术:交互过程中的数据存储技术
会话中会产生一些数据,比如:注册页面客户录入的数据,访问服务器的时间,后台生成的验证码...

数据怎么存储:
  A、最常见方案 ---- 数据库存储
  B、将数据存储到 Cookie ---- 数据由浏览器保存
  C、将数据存储到 session --- 数据由服务器保存 (和数据库的区别,没有实现持久化存储)

Cookie
  浏览器中的存储形式为:
    站点(服务器硬件)项目(服务器所在程序)路径(具体的servlet)
  创建Cookie并发送到浏览器:
    Cookie c = new Cookie("键","值");
    response.addCookie(c);  //没有设置路径Cookie的路径就是Servlet路径
      底层封装:
        响应头:set-cookie 键=值
        浏览器进行保存:
          选项 ----> 隐私 ----> cookie 查看
        浏览器将Cookie携带到服务器:
        将Cookie存储到请求头
          键:cookie  
          值:不同的Cookie使用";"隔开
Cookie使用:
  A、键重名时,后面的 Cookie 会覆盖前面的(当前阶段:Cookie 不能重名)
  B、获取 Cookie 的键和值
    getName()   getValue()
  C、Cookie的存活时间
    Cookie 默认存活至浏览器关闭 ----- Cookie 只在内存中
    setMaxAge(时间值秒数) --- 可以设置 Cookie的存活时间 ---- 浏览器关闭时,会将 Cookie 序列化到磁盘文件
      注意:
        1、Cookie 怎么删除?
          可以调用 setMaxAge(0)
        2、setMaxAge(负数) --- 和不设置一样,存活到会话结束
  Cookie的重名存储
    A:调用setPath实现,相同名称的Cookie如果path不同,那么可以重名存在
      Cookie.setPath("/day3701demo_cookie/a/b")
      必须要指定这个路径才能获取到当前的这个Cookie,同时也能获得父级的目录
    B:站点不同时,Cookie也可以重名
  Servlet路径与Cookie获取
    A:和Servlet同级的Cookie可以获取
    B:父级下面的Cookie也可以获取到
  Cookie的中文键值:
    创建:Cookie c = new Cookie(URLEncoder.encode("中","UTF-8"),URLEncoder.encode("国","UTF-8"));
    获取:键:URLDecoder.decode(c1.getName(),"UTF-8")
       值:URLDecoder.decode(c1.getValue(),"UTF-8")
  Cookie的限制:
    1、在浏览器中一个Cookie存储的数据不超过 4kb
    2、浏览器针对于一个服务器,最多支持 20 个cookie
    3、浏览器最多就支持 300 个Cookie

Session:
  1、Session 使用流程
    A、第一次访问 Servlet ,调用 getSession 方法,这时会创建一个 Session 对象 ----- getSession --- 创建
      并生成一个 cookie,cookie 和 session 是关联的(有相同的ID)(此时的Cookie被隐藏)
    B、JSESSIONID 被发送到浏览器,浏览器保存
    C、再次访问时,取出JSESSIONID 传递到服务器
    D、服务器解析查找 对应的Session ---- getSession --- 获取已经存在的
    E、使用 Session
  2、session特点:
    A、session 可以实现不同Servlet之间数据的共享
    B、session 通过 Cookie 的ID 进行查找 cookie 的值刚好和 Session 对象的ID值一样
      session和ServletContext比较:
        ServletContext 不光在 Servlet 之间可以共享,对于每一个会话也是共享的
        session 在 servlet 之间共享,但是每一个会话都有自己的一个session
  3、session 使用语法
    A、获取Session ---- request.getSession()
    B、设置值 ---------- session.setAttribute("键",Object类型);
      获取值 ------------ session.getAttribute("键")
      删除 --------------session.removeAttribute("键");
  4、session 的生命周期
    A、创建
      第一次调用 getSession() 创建
      getSession() ---- 第一次访问创建
      getSession(true) - 第一次访问创建
      getSession(false)- 第一次访问不会创建对象,得到null
    B、使用

    C、消亡
      1、强制 Session 消亡 --- 调用invalidate() 方法
      2、使用Tomcat 默认实现让 session 自然消亡 ----- 浏览器超过 30分钟不使用 session ,那么tomcat 会干掉 session
      3、关闭服务器时,序列化 session ----- 正常关闭(客户端没有关闭)
        非正常关闭:session 不能序列化,丢失了(序列化之后重新开启服务器此次会话的数据继续使用,丢失了重新设置)
  5、session注意事项
    1、注意浏览器关闭时,一次会话结束,那么JSESSIONID 释放,这次会话对应的 Session ,下次访问不能获取到
    2、服务器的session 超过默认的30分钟,就可以销毁了
作用域:
  ServletContext ---- 全局有效(不同的客户端访问的是同一个)
  session ----------- 不同servlet之间(不同的客户端访问会产生不同的session),一次会话中只有一个session
  request ----------- 只是在本次请求有效

Session 和 Cookie
  1、存储位置不同
  2、存储的数据不同 cookie 字符串, session Object类型
  3、存储个数不同
  4、cookie 不安全,以文件方式存储在浏览器的对应的磁盘上
  5、cookie 和 session 比较 session 加大服务器端的压力,cookie 不存在这个问题
  6、浏览器禁用Cookie,session 必须结合URL重写

原文地址:https://www.cnblogs.com/chonglchong/p/6850891.html