会话管理(Cookie和Session)知识点总结-DX的笔记

软件的会话

  • 浏览器访问Web程序会产生会话,打开浏览器访问程序的第一个资源表示会话的开始,关闭浏览器表示会话的结束
  • 会话中的数据由域对象管理
  • Servlet中4种域对象:pageContext、request、session、servletContext
  • 会话的两种技术
    • Cookie:将会话数据保存在客户端的技术
    • Session:将会话数据保存在服务端的技术

Cookie技术

特点

  • 将数据保存在客户端
  • 只能保存字符串,不能直接保存中文,不能保存对象
  • 长度不能超过4k
  • 数据保存在文本文档中,以明码的形式保存
  • cookie的个数不能超过200,每个站点不能超过20(现在的浏览器不一定了)
  • Cookie这门技术使用多种语言都能操作,我们使用Java操作

Cookie核心技术

  • cookie的创建

    Cookie cookie = new Cookie(String name,String value);
    
  • cookie的设置:

    Cookie.setMaxAge(int num);//设置cookie的存活时间
    Cookie.setPath();//设置cookie的访问路径
    resp.addCookie(cookie);//将cookie发送到客户端浏览器
    Cookie[] cookies = req.getCookies();//servlet读取cookie
    
  • 从Cookie中取值

    String name = cookie.getName();
    String value = cookie.getValue();
    

Cookie原理

  • cookie是如何从服务端到客户端的?
    • 程序中使用resp.addCookie(cookie)发送,本质上是使用响应头set-Cookie将cookie的内容发送到浏览器
  • cookie是如何从客户端到服务端的?
    • 浏览器在访问服务端程序的时候,会使用请求头cookie将保存的cookie内容发送到服务端.
  • 浏览器是如何知道服务端程序需要cookie?
    • 浏览器并不知道服务端程序是否需要cookie,只要访问,就会携带所有符合条件的cookie发送过去.
    • 服务端如果需要,就获取,如果不需要,就无需理会

Cookie的细节

Cookie的存活时间
  • 默认的cookie的存活时间是-1,表示临时保存

  • SetMaxAge(int num): 设置cookie的存活时间

    • 值为负整数:表示临时保存在浏览器的内存中,浏览器关闭时销毁,Cookie的默认值是-1.
    • 值为正整数:表示使用文本保存,浏览器关闭对于cookie没有影响,单位是秒
    • 值为0:实现删除操作,cookie没有提供显式的删除方法
  • 浏览器在携带cookie的时候,会选择哪些发送给服务端?

    • 浏览器在携带cookie的时候会进行筛选(可在浏览器中查看)
      • domain:判断是否是同一个网站,使用setDomain()设置
      • Path:如果是同一个网站下的cookie,通过这个属性判断是否是同一个路径下的,使用setPath() 设置
    • 注意:虽然可以设置,但是在开发中一般不使用

Session技术

特点

  • 能直接保存对象

Session的核心技术

  • Session对象的获取(对象由web服务器创建)
    • req.getSession():获取session对象.
    • req.getSession(boolean flag):获取session对象.
  • Session对象的操作
    • String getID(): 获取session对象的id值
    • Void invalidate() : 销毁session对象
    • Void setMaxInactiveInterval(int num) : 设置session的存活时间
  • Session对象作为域对象的操作
    • SetAttribute(String name,Object value) : 给session中添加键值对
    • getAttribute(String name) : 从session中根据键获取值
    • renmoveAttribute(String name) : 给session中根据键删除键值对

Session原理

  • session能够绑定浏览器,区分有没有分配session对象,实现区分用户.
  • Session是如何绑定浏览器的?
    • 浏览器第一次访问服务器,服务器会检查浏览器请求中携带的cookie,有没有包含一个名为JSESSIONID的cookie.如果没有,说明浏览器还没有绑定session对象,服务器会创建一个新的session对象供浏览器使用,同时会使用响应传输一个Cookie,名为JSESSIONID的cookie,值就是刚才创建的session对象的ID值,这样浏览器就保存了session的ID
    • 当浏览器再次访问服务器,会携带上次保存的cookie(JSESSIONID),服务器检查到这个cookie,就会取出cookie的值,作为session对象的ID查找服务器保存的所有session对象,看看有没有这个对象,如果有就返回,如果没有就会创建新的
  1. Web服务器是如何管理session对象?
  • 管理session对象的数据结构其实就是一个map类型的
  1. Map<String,Object>
  • <”1EA441C68C5C66A0A091357A2127CFD5”, session1>
  • <”1EA441C68C5C66A0A091357A2127CFD6”, session2>
    • <”…”, sessionN>
  • 总结:
    • session的实现需要服务器和浏览器共同作用才可以
    • 如果双方有一方出现问题,都会导致session失效

Sesson细节

  • getSession()与getSession(boolean flag)的区别:

    • getSession()
      • 第一次访问,没有匹配的session对象,会创建一个新的session对象返回
      • 第二次访问,会查找有没有分配的session对象,如果有,返回原来分配的如果没有,返回新的,如果有,返回原有的
    • getSession(true): 效果等效于getSession()
    • getSession(false)
      • 访问的时候,会查找有没有分配的session对象,没有匹配的session对象,返回null
      • 如果有,返回原来分配的
    • 平时使用的时候,使用无参的方法即可.特殊场景下,根据需要使用有参方法
  • 设置session的存活时间:

    • 在tomcat的conf目录的web.xml文件中有如下配置信息

      <session-config>
           <session-timeout>30</session-timeout>
       </session-config>
      
      • 说明默认情况下,session的失效时间是30分钟.
      • 这段配置应用于改服务器下所有的项目
      • 可以在项目的web.xml文件中重新配置当前项目的session的失效时间
    • session.setMaxInactiveInterval(int num) : 设置指定的session对象的失效时间,单位是秒

    • session.invalidate() : 销毁指定的session对象

  • 如何实现浏览器关闭,session不失效

    // 1.session对象的获取
    HttpSession session = req.getSession();
    // 2.获取session对象的ID
    String id = session.getId();
    System.out.println(id);
    // 3.重写保存sessionID的cookie
    Cookie cookie = new Cookie("JSESSIONID",id);
    cookie.setMaxAge(60*60*24);
    resp.addCookie(cookie);
    

总结

  • 会话管理:浏览器和服务器会话过程中的产生的会话数据的管理。

  • Cookie技术

    new Cookie("name","value")
    response.addCookie(coookie)
    request.getCookies()
    
  • Session技术

    request.getSession();
    setAttrbute("name","会话数据");
    getAttribute("会话数据")
    
  • 购物车的实现使用Cookie,登陆功能使用session,登出销毁session

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值