会话跟踪(Cookie&Session)

本文详细介绍了Cookie和Session在Web会话跟踪中的应用,包括Cookie的工作原理、存储中文、生命周期管理,以及Session的实现机制、钝化活化和销毁策略。重点对比了两者在数据存储和会话共享上的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

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

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

一、Cookie

  1. Cookie:客户端会话跟踪技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。
  2. Cookie的工作流程:
    A. 浏览器第1次请求服务器,服务器响应的同时附带发送Cookie。
    B. 浏览器接收到Cookie和数据,在第2次请求中携带Cookie发送到浏览器。
    C. 浏览器就可以通过第2次请求的Cookie来识别客户端。

(一)基本使用

在这里插入图片描述

(二)原理

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

  1. 在第1次响应客户端时响应头:set-cookie,通过HTTP协议在响应头里带上Cookie内容响应给客户端。
  2. 客户端在第2次及以后请求服务端时请求头:cookie,通过HTTP协议在请求头里带上Cookie内容请求服务端。
    在这里插入图片描述

(三)使用细节

(1)Cookie存活时间

  1. 默认情况下,Cookie存储在浏览器内存中,当浏览器关闭时,内存释放,Cookie也一并被销毁。
  2. 可以使用setMaxAge(int seconds)设置Cookie存活时间(单位秒)
    A. 正数:将Cookie写入浏览器所在设备的硬盘,持久化存储,到时间自动删除。
    B. 负数:默认值,Cookie存在内存中,浏览器关闭时就被销毁。
    C. 零:删除对应Cookie。
    eg:
        //响应Cookie,并设置存活时间为一天
        Cookie cookie = new Cookie("username", "zhangsan");
        cookie.setMaxAge(60*60*24);
        response.addCookie(cookie);

(2)Cookie存储中文

  1. Cookie不能够直接存储中文
  2. 要存储中文,需要进行转码:使用URL编码(URLEncoder、URLDecoder)
		//响应Cookie到客户端,中文编码
		String value = "张三";
		//URL编码
		value = URLEncoder.encode(value,"UTF-8");
		Cookie cookie = new Cookie("username", value);
		response.addCookie(cookie);

		//请求Cookie到服务端,中文解码
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie1 : cookies) {
            String name = cookie1.getName();
            String value = cookie1.getValue();
            //URL解码
            value = URLDecoder.decode(value, "UTF-8");
            System.out.println(name + ": " + value);
        }

二、Session

  1. Sesssion:服务端会话跟踪技术,将会话数据存到服务端。
  2. JavaEE提供了HttpSession接口,来实现一次会话里的多次请求间数据共享功能
  3. 工作流程:
    在同一个客户端的多次请求里,服务端request.getSession()获取的都是同一个Session对象。

(一)基本使用

在这里插入图片描述

(二)原理

Session的实现是基于Cookie的:

  1. 在第1次获取Session对象时,Session有一个唯一标识id
  2. 当服务端响应客户端时,tomcat发现使用的是session对象,会自动的把Session的唯一标识id当作Cookie响应给客户端set-cookie:JSESSIONID=XXXXXXX
  3. 客户端第2次请求服务端时,会携带cookie:JSESSIONID=XXXXX请求服务端,然后服务端会寻找自己有没有id相同的Session对象,有就直接拿来用,没有就新建一个Session对象。
  4. 通过第三步就保证了客户端的多次请求获取的都是同一个Session对象。
    在这里插入图片描述

(三)使用细节

(1)Session钝化、活化:

  1. 服务器重启后,Session中的数据是否还在?答案:在,因为有钝化和活化的存在。
    A. 钝化:在服务器正常关闭后,tomcat会自动将Session数据写入硬盘文件中。
    B. 活化:再次启动服务器后,从文件中加载数据到Session中。
    C. 注意,一定要是服务器正常关闭才能存储到硬盘中
  2. Session销毁
    默认情况下,无操作30分钟后自动销毁(在web.xml的<web-app>标签中可以自定义这个时间)
<session-config>
        <session-timeout>30</session-timeout>
    </session-config>

调用Session对象的invalidate()方法,可以销毁对象(可以用于用户退出登录功能)

区别

相同:Cookie和Session都是用来完成一次会话内多次请求间的数据共享

不同:
在这里插入图片描述
片面的一句话总结:保存用户未登录时的信息用Cookie,用户登录后的信息用Session。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值