JavaWeb——会话跟踪技术Cookie、Session

105 阅读6分钟

会话跟踪技术学习

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

    • 这啥意思呢? 就是比方说我用电脑打开了一个浏览器,访问淘宝官网,这时候就相当于是与淘宝的服务器建立了一个会话,只要我浏览器不关闭,不管我是对淘宝的服务器发出了多少次请求,我这都属于是一个会话。
    • 也就是说,“会话”是跟浏览器绑定的。
  • 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。

    • 比如我通过浏览器访问淘宝官网,添加了某个商品到购物车,这是一次会话,然后我点击“查看购物车”这又是一次会话,我能够看到我购物车中多了这么一件商品,这就是实现了所谓的同一个会话中的“数据共享”
  • ▲ 实现方式

    1. 客户端会话跟踪技术:Cookie
    2. 服务端会话跟踪技术:Session

Cookie

Cookie基本使用

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

Cookie的基本使用

  • 发送Cookie

    • 创建Cookie对象,设置数据 Cookie cookie = new Cookie("key","value");
    • 发送Cookie到客户端:使用response对象 response.addCookie(cookie);
  • 获取Cookie

    • 获取客户端携带的所有Cookie,使用request对象 Cookie[] cookies = request.getCookies();

    • 遍历数组,获取每一个Cookie对象,使用for循环即可

    • 使用Cookie对象方法获取数据

      • cookie.getName(); 获取键
      • cookie.getValue(); 获取值

这里仍然是写一个小Demo来完成:

首先CookeDemo1:

作为服务器端创建Cookie对象,设置数据,并且将创建的Cookie使用response对象,发送到客户端

package com.itheima.web.cookieDemos;
​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie=new Cookie("username","nylonmin");
        resp.addCookie(cookie);
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

这里我使用的是windows自带的edge浏览器,访问地址为http://localhost:8080/tomcat_demo1/cookieDemo1

访问之后,通过直接查询浏览器中已经保存下来的cookie,可以看到如下图:

我们自己设置并且发送的cookie已经存储到浏览器中了

Snipaste_2024-11-21_22-40-40.png

接下来继续写CookieDemo2

因为一个会话中可能发送多个cookie,每个cookie都有不同的用处。所以我们需要根据其 “name”来提取我们自己真正需要的那个。

这里实际上就能看到控制台输出的是nylonmin

package com.itheima.web.cookieDemos;
​
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取cookie
        Cookie[] cookies = req.getCookies();
        for (Cookie c:cookies){
            String name = c.getName();
            if("username".equals(name)){
                System.out.println(c.getValue());
                break;
            }
        }
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

Cookie原理

Cookie的实现是基于HTTP协议的。

  1. 服务器创建Cookie

    • 服务器在响应客户端请求时可以创建一个或多个 Cookie,然后我们在通过HttpServletResponse response对象addCookie的时候。服务器(我们这里是Tomcat)会自动识别,并在正儿八经发送响应的时候,在 HTTP 响应头中发送给客户端。这通常是通过设置 Set-Cookie 响应头来实现的。
  2. 浏览器存储Cookie

    • 浏览器接收到包含 Set-Cookie 头的响应后,会读取 Cookie 信息,并根据服务器指定的属性(如过期时间、路径、域等)将其存储在本地。浏览器通常将 Cookie 存储在内存中,并且在某些情况下,也会将它们持久化存储到磁盘上,以便在浏览器关闭后再次打开时仍然可用。
  3. 后续请求携带Cookie

    • 在同一域名下的后续 HTTP 请求中,浏览器会自动在请求头中包含 Cookie 头,将存储的 Cookie 发送回服务器。这允许服务器识别用户会话和状态。
    • Cookie 有域和路径属性,它们定义了 Cookie 的作用域。只有发送到相同域和路径的请求才会携带 Cookie。

Session

Snipaste_2024-11-21_23-04-43.png

这里我们直接来对Seesion的原理来进行一个小小的说明;

首先,还是一定一定要明确,Sesson是把数据存储到 服务端

那么就引出一个小小的问题,ok,你说Session是存储在服务端的,那么如果我这个时候,有一个新的浏览器进来,同样是访问这个界面,总不可能我这个新的浏览器获取的Session也是同一个Session吧?

—— 首先,Session也是基于会话的,也就是说一个会话,一个Session

Session实际上是基于Cookie来实现的

  1. 创建 Session

    • 当用户首次访问服务器时,服务器会创建一个新的 Session。这个 Session 会有一个唯一的标识符,称为 Session ID。
  2. 发送 Session ID

    • 在正式响应请求的时候,服务其发现,你小子用了Session是吧,ok,那我就自动把将 Session ID 发送给客户端,通常是通过设置一个名为 JSESSIONID 的 Cookie 发送的。
  3. 存储 Session 数据

    • 服务器在内存或数据库中存储 Session 数据,使用 Session ID 作为键来检索和存储数据。
  4. 后续请求

    • 用户的每个后续请求都会包含 Session ID(通常在 Cookie 中),服务器使用这个 ID 来检索对应的 Session 数据。
    • 每次用户访问服务器时,服务器都会生成一个新的、唯一的 Session ID。这意味着即使两个用户同时访问服务器,他们也会获得不同的 Session ID。
    • 浏览器对 Cookie 的处理是隔离的,每个浏览器实例都有自己的 Cookie 存储空间。因此,不同浏览器的请求将携带不同的 Cookie,包括 Session ID。

总结

Cookie和Session都是用来完成以此会话内多次请求之间的数据共享的。

区别:

  1. 存储位置:Cookie是将数据存储在客户端,Session是将数据存储在服务器端
  2. 安全性上:Cookie不安全,因为用户可以直接通过浏览器看到cookie中的内容,Session安全
  3. 数据大小:Cookie最大3KB,Session无大小限制
  4. 存储时间:Cookie可以长期存储,Session默认30分钟
  5. 服务器性能:Cookie不占服务器资源,Session占用服务器资源