Cookie&Session

一、会话跟踪技术

  1. http协议是无状态的

  2. 很多时候,我们需要把它搞成有状态的,例如京东购物

  3. 实现思路,借助http协议的响应头和请求头来回传递标识

    具体技术实现:cookie 和 session

    • 客户端会话跟踪技术:Cookie(保存在浏览器端)

    • 服务端会话跟踪技术:Session(共享数据保存在浏览器内存中)

  • 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应

  • 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据

二、Cookie

Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问(多次请求共享数据)

Cookie 基本使用

  1. 创建Cookie对象,设置数据

    Cookie cookie = new Cookie("key","value");
    
  2. 发送Cookie到客户端:使用response对象

    response.addCookie(cookie);
    
  3. 获取客户端携带的所有Cookie,使用request对象

    Cookie[] cookies = request.getCookies();
    
  4. 遍历数组,获取每一个Cookie对象:for

  5. 使用Cookie对象方法获取数据

    cookie.getName();
    cookie.getValue();
    

Cookie 原理

  • 对于Cookie的实现原理是基于HTTP协议的,其中设计到HTTP协议中的两个请求头信息:
    • 响应头:set-cookie
    • 请求头: cookie

Cookie 使用细节

Cookie 存活时间

  • 默认情况下,Cookie 存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁

  • setMaxAge(int seconds):设置Cookie存活时间

    1. 正数:将 Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除

      cookie.setMaxAge(60 * 60 * 24 * 7);//持久化保存cookie
      
    2. 负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则 Cookie被销毁

      cookie.setMaxAge(-1);//默认值,浏览器关闭,Cookie销毁
      
    3. 零:删除对应 Cookie

      cookie.setMaxAge(0);//删除Cookie
      
  • Cookie 存储中文
    • Cookie 不能直接存储中文
    • 如需要存储,则需要进行转码:URL编码
      String s = "张三";
      //url编码
      s = URLEncoder.encode(s, "utf-8");
      
      //URL解码
      value = URLDecoder.decode(value, "utf-8");
      

Cookie 小结:

  • cookie的作用?

    多次请求共享数据

    request(一次请求共享数据)——》 会话跟踪(cookie和session)多次请求之间共享数据——》数据库

  1. Cookie能解决什么问题?

    多次请求共享数据

  2. cookie是如何把http的无状态搞成有状态的?

    通过HTTP响应头

  3. cookie是浏览器,还是web服务器端创建的?

    服务器

  4. 如何创建cookie?
     Cookie cookie = new Cookie(key, value);
    
  5. 如何保存cookie,如何持久化保存cookie?
    coolie.setMaxAge(int seconds)//设置Cookie存活时间
    cookie.setMaxAge(60 * 60 * 24 * 7);//持久化保存cookie
    
  6. 如何删除cookie?
    cookie.setMaxAge(0);
    

三、Session

Session是基于Cookie实现的。

Session实现的也是一次会话中的多次请求之间的数据共享。

Session 基本使用

  • 服务端会话跟踪技术:将数据保存到服务端

  • JavaEE 提供 HttpSession接口,来实现一次会话的多次请求间数据共享功能

  • 使用:

    1. 获取Session对象

      HttpSession session = request.getSession();
      
    2. Session对象功能:

      • 存储数据到 session 域中
      void setAttribute(String name, Object o);
      
      • 根据 key,获取值
      Object getAttribute(String name);
      
      • 根据 key,删除该键值对
      void removeAttribute(String name);
      

Session 使用细节

Session 钝化、活化:

服务器重启后,Session中的数据是否还在?

只要浏览器没有关闭数据就还在

  • 钝化:在服务器正常关闭后, Tomcat会自动将 Session数据写入硬盘的文件中

    //销毁session
    //安全退出(注销)
    session.invalidate();
    
  • 活化:再次启动服务器后,从文件中加载数据到Session中

​ 让session浏览器关闭还能使用数据

Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
  • Seesion 销毁:

    默认情况下,无操作,30分钟自动销毁

    <session-config>
    	<session-timeout>30<session-timeout>
    </session-config>
    

    调用 Session对象的 invalidate()方法

    安全退出

    //销毁session
    //安全退出(注销)
    session.invalidate();
    

Session 小结

  1. Session的作用?

    request——》会话范围(多次请求和响应,Redirect)——》数据库

  2. 如何获取?

    //1.获取session
    HttpSession session = request.getSession();
    
  3. 如何保存数据到session

    //2.向session中保存数据
    session.setAttribute("msg", "天王盖地虎");
    
  4. 如何从session中取出数据?

    // 2.从session中获取数据
    Object cipher = session.getAttribute("msg");
    
  5. 如何销毁session

    //销毁session
    //安全退出(注销)
    session.invalidate();
    
  6. session的原理

    Session是基于Cookie实现的

  7. session的注意事项

​ session的创建并不是在浏览器向服务器发出请求的瞬间产生的,而是在server端调用HttpServletRequest.getSession()时创建的。

Cookie与Session区别?

  • 相同点:

    • 都可以在多次请求和响应之间共享数据
  • 不同点

    • 数据保存位置

      cookie:浏览器端

      session:服务器内存中

    • 安全性

      cookie:不太安全

      session:安全

    • 数据大小

      cookie:4kb,字符串

      session: Object,无限制

    • 保存时间

      cookie:长期保存,持久化

      session:默认30分钟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.han、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值