深入理解 Cookie 和 Session 在 Java Web 中的应用

1. 什么是 Cookie

Cookie 是存储在客户端(通常是浏览器)的一小段文本信息,由服务器发送给客户端,客户端在后续向同一服务器发起请求时会自动携带这些 Cookie 信息,服务器可以根据这些信息来识别客户端或者获取之前存储的相关数据,从而实现一定程度的状态跟踪。

2. Cookie 的基本操作

创建 Cookie
//创建cookie对象
Cookie cookie = new Cookie("Account","admin");
//设置cookie有效期 单位秒
//>0 表示cookie 有效期
//=0 删除cookie
//<0 会话cookie
cookie.setMaxAge(60*60);
//将cookie响应给客户端
response.addCookie(cookie);

在上述代码中,首先创建了一个名为 "Account",值为 "admin" 的 Cookie 对象。然后通过 setMaxAge 方法设置了它的有效期为 1 小时(60 * 60 秒)。如果将 setMaxAge 设置为 0,则意味着删除该 Cookie;若设置为小于 0 的值,那么这个 Cookie 就是会话 Cookie,会在浏览器会话结束时自动失效。最后,通过 response.addCookie 方法将创建好的 Cookie 发送给客户端。

读取 Cookie

要读取客户端发送过来的 Cookie 信息,可以参考 GetCookie 类中的代码:

Cookie[] cookies = request.getCookies();
for(int i=0;i<cookies.length;i++) {
    System.out.println(cookies[i].getName()+"-------->"+cookies[i].getValue());
}

在这段代码里,首先通过 request.getCookies 方法获取客户端发送过来的所有 Cookie,它们以数组的形式返回(如果没有 Cookie,则返回 null)。然后通过循环遍历这个数组,利用 getName 方法获取 Cookie 的名称,用 getValue 方法获取对应的 Cookie 值,并进行打印输出,这样就能获取到客户端携带的各个 Cookie 中存储的信息了。

3. Cookie 的应用场景

Cookie 常用于记住用户登录状态(比如保存用户名等简单信息,下次登录时自动填充)、个性化设置(如网站的语言偏好、页面布局偏好等)等场景,方便为用户提供更加便捷和个性化的服务。

二、Session 概述

1. 什么是 Session

Session 是一种服务器端的机制,用于在多个页面请求或者多次交互过程中跟踪用户的状态。它在服务器端创建一个对应的 Session 对象来存储特定用户相关的数据,每个 Session 都有一个唯一的标识符(Session ID),服务器会将这个 Session ID 通过 Cookie 或者其他方式传递给客户端,客户端后续请求时携带这个 Session ID,服务器就能根据它找到对应的 Session 对象并获取其中存储的数据了。

2. Session 的基本操作

创建和设置 Session 数据

在 SetSession 类中展示了如何创建 Session 并设置属性的代码示例:

//获取session对象
HttpSession session = request.getSession();
session.setAttribute("account", "999");
session.setAttribute("password", "888");
session.setAttribute("key", "value");

这里首先通过 request.getSession 方法获取到 Session 对象,若不存在则会创建一个新的 Session。然后使用 setAttribute 方法向 Session 中添加了三个属性,分别是 "account""password" 和 "key",并设置了对应的值。这样就在服务器端的 Session 中保存了用户相关的数据,方便后续在不同的请求处理环节中使用。

获取 Session 数据及 Session ID

在 GetSession 类中有获取 Session 相关信息的代码:

HttpSession session  = request.getSession();
System.out.println(session.getId());
System.out.println(session.getAttribute("account"));
System.out.println(session.getAttribute("password"));
System.out.println(session.getAttribute("key"));

同样先通过 request.getSession 方法获取 Session 对象,接着通过 getId 方法获取到当前 Session 的唯一标识符 Session ID 并进行打印输出。然后使用 getAttribute 方法分别获取之前设置的各个属性的值并打印,通过这样的方式可以查看 Session 中存储的用户相关数据情况。

3. Session 的应用场景

Session 常被用于用户登录后的整个交互过程,比如保存用户的登录信息、购物车数据(在电商网站中)等,确保在用户浏览不同页面或者进行多次操作时,服务器能够准确识别用户身份并获取相应的业务数据。

三、Cookie 和 Session 的关联与区别

1. 关联

  • Session 的实现通常依赖于 Cookie 来传递 Session ID,服务器将 Session ID 放在 Cookie 中发送给客户端,客户端后续请求时带着这个 Cookie(包含 Session ID),服务器就能找到对应的 Session 了,就像我们代码中隐含的这种机制一样,虽然没有显式体现 Session ID 通过 Cookie 传递的细节,但实际底层就是这样协同工作的。
  • 它们都是为了解决 HTTP 协议无状态这一特性带来的问题,通过不同的方式帮助服务器记住客户端的相关状态和信息,以便提供更好的用户体验和实现复杂的业务逻辑。

2. 区别

  • 存储位置:Cookie 存储在客户端浏览器,而 Session 是在服务器端创建并存储相关数据。
  • 安全性:相对来说,Session 存储在服务器端,数据安全性更高一些,因为客户端难以直接访问到服务器端的 Session 内容;而 Cookie 存储在客户端,如果没有进行加密等安全处理,数据容易被客户端查看甚至篡改(不过可以通过设置一些属性如 HttpOnly 等来增强安全性)。
  • 数据大小限制:Cookie 一般对数据大小有限制,不同浏览器限制不同,但通常不能存储太大的数据量;而 Session 存储在服务器端,理论上可以根据服务器的配置来存储相对更多的数据(当然也要考虑性能等因素合理使用)。

四、关于 Session 的特殊情况处理 —— 重写 URL

在实际应用中,存在一种情况,就是当客户端禁用了 Cookie 时,Session 通过 Cookie 传递 Session ID 的方式就会失效。这时,可以采用重写 URL 的方式来挽救 Session,让 Session 依然能够正常工作。

在 SetSession 类中就有这样的示例代码:

//当cookie被禁用,可以靠重写url来挽救session
String newURL = response.encodeRedirectUrl("GetSession");
System.out.println(newURL);
response.sendRedirect(newURL);

这里通过 encodeRedirectUrl 方法对要重定向的 URL 进行重写,将 Session ID 以特殊的方式附加到 URL 中,这样即使客户端没有 Cookie 来传递 Session ID,服务器也能根据 URL 中的相关信息识别对应的 Session,确保业务流程的正常进行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944573.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vulnhub靶机billu_b0x精讲

靶机下载 https://www.vulnhub.com/entry/billu-b0x,188/ 信息收集 扫描存活主机 nmap -sP 192.168.73.0/24 192.168.73.141为目标主机&#xff0c;对其进行进一步信息收集 端口扫描 nmap --min-rate10000 -p- 192.168.73.141 目标只开放了22和80端口 针对端口进行TCP探…

碰一碰发视频矩阵系统源码搭建,支持OEM

一、引言 随着短视频的火爆发展&#xff0c;碰一碰发视频的矩阵系统逐渐受到关注。这种系统能够实现用户通过碰一碰设备&#xff08;如 NFC 标签&#xff09;快速触发视频的发布&#xff0c;在营销推广、互动体验等领域有着广泛的应用前景。本文将详细介绍碰一碰发视频矩阵系统…

使用Kubernetes部署MySQL+WordPress

目录 前提条件 部署MySQL和WordPress 编写yaml文件 应用yaml文件 存在问题及解决方案 创建PV(持久化卷) 创建一个PVC(持久化卷声明) 部署添加PVC 查看PV对应的主机存储 删除资源 查看资源 删除deployment和service 查看主机数据 删除PVC和PV 删除主机数据 前提条…

Python笔记(6)-文件及IO操作

文件的基本操作 python操作文件的步骤&#xff1a; 1、打开文件&#xff1a; 变量名open(filename,mode,encoding) 2、操作文件&#xff1a; 变量名.read() 变量名.writer(s) 3、关闭文件&#xff1a; 变量名.close() def my_write():#1、&#xff08;创建&#xff09;…

windows系统下使用cd命令切换到D盘的方法

windows系统下使用cd命令切换到D盘的方法 系统环境配置 win10系统原装C盘后期自己安装的硬盘D盘 python3.8安装在D盘中 问题说明 winR打开终端&#xff0c;使用 cd d:命令&#xff0c;无法将当前目录切换到D盘 解决方法 方法一&#xff1a;使用下面这条命令 cd /d d:运…

iOS 苹果开发者账号: 查看和添加设备UUID 及设备数量

参考链接&#xff1a;苹果开发者账号下添加新设备UUID - 简书 如果要添加新设备到 Profiles 证书里&#xff1a; 1.登录开发者中心 Sign In - Apple 2.找到证书设置&#xff1a; Certificate&#xff0c;Identifiers&Profiles > Profiles > 选择对应证书 edit &g…

香橙派5Plus启动报错bug: spinlock bad magic on cpu#6, systemd-udevd/443

一、问题 如图&#xff1a; 接上调试串口&#xff0c;每次启动都会报错。不过使用过程中没有发现有什么影响。 百度查阅&#xff0c;有一位博主提到&#xff0c;但是没有细说解决方案&#xff1a; spinlock变量没有初始化_spinlock bad magic on-CSDN博客https://blog.csdn.n…

小程序配置文件 —— 13 全局配置 - window配置

全局配置 - window配置 这里讲解根目录 app.json 中的 window 字段&#xff0c;window 字段用于设置小程序的状态栏、导航条、标题、窗口背景色&#xff1b; 状态栏&#xff1a;顶部位置&#xff0c;有网络信号、时间信息、电池信息等&#xff1b;导航条&#xff1a;有一个当…

UI页面布局分析(4)- 贵族 特权分页列表

引言 在现在移动应用中&#xff0c;展示用户特权的UI设计不仅是吸引用户的关键手段&#xff0c;更是提升产品体验的重要部分。特别是在直播场景中&#xff0c;贵族特权作为一种高价值用户身份的象征&#xff0c;通常需要通过精致的页面和流程的交互来突出其重要性和独特性。 …

Spring Boot教程之三十九: 使用 Maven 将 Spring Boot 应用程序 Docker 化

如何使用 Maven 将 Spring Boot 应用程序 Docker 化&#xff1f; Docker是一个开源容器化工具&#xff0c;用于在隔离环境中构建、运行和管理应用程序。它方便开发人员捆绑其软件、库和配置文件。Docker 有助于将一个容器与另一个容器隔离。在本文中&#xff0c;为了将Spring B…

【208】车辆管理系统

--基于SSM车辆管理系统 主要功能: 个人中心 员工管理 用户管理 基础数据管理 车辆管理 保养登记管理 事故登记管理 维修登记管理 违章登记管理 开发技术栈: 开发语言 : Java 开发软件 : Eclipse/MyEclipse/IDEA JDK版本 : JDK8 开发框架 : SSM 服务器 : Tomcat8/…

Linux系统编程——线程

目录 一、前言 二、线程 1、线程的理解 三、线程相关的接口 1、线程的创建 2、线程的等待 3、实验 四、总结 1、线程优点 2、线程缺点 3、线程异常 4、Linux下的进程与线程对比 一、前言 之前的文章中我们已经对进程相关的概念做了认识&#xff0c;从创建进程、子进…

从百度云网盘下载数据到矩池云网盘或者服务器内

本教程教大家如何快速将百度云网盘数据集或者模型代码文件下载到矩池云网盘或者服务器硬盘上。 本教程使用到了一个开源工具 BaiduPCS-Go&#xff0c;官方地址 &#xff1a; https://github.com/qjfoidnh/BaiduPCS-Go 这个工具可以实现“仿 Linux shell 文件处理命令的百度网…

手机租赁平台开发全攻略打造高效便捷的租赁服务系统

内容概要 手机租赁平台开发&#xff0c;简单说就是让用户能轻松租赁各类手机的高效系统。这一平台不仅帮助那些想要临时使用高端手机的人们节省了不少资金&#xff0c;还为商家开辟了新的收入渠道。随着智能手机的普及&#xff0c;很多人并不需要长期拥有一部手机&#xff0c;…

GitHub 桌面版配置 |可视化界面进行上传到远程仓库 | gitLab 配置【把密码存在本地服务器】

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 桌面版安装包下载clone 仓库操作如下GitLab 配置不再重复输入账户和密码的两个方…

flask后端开发(11):User模型创建+注册页面模板渲染

目录 一、数据库创建和配置信息1.新建数据库2.数据库配置信息3.User表4.ORM迁移 二、注册页面模板渲染1.导入静态文件2.蓝图注册路由 一、数据库创建和配置信息 1.新建数据库 终端中 CREATE DATABASE zhiliaooa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2…

OpenAI 12天发布会:AI革命的里程碑@附35页PDF文件下载

在人工智能的浪潮中&#xff0c;OpenAI的12天发布会无疑是2024年科技界的一场盛宴。从12月5日开始&#xff0c;OpenAI连续12天每天发布一个新应用或功能&#xff0c;标志着AI技术的又一次飞跃。本文将梳理这些激动人心的发布&#xff0c;带你一探究竟。 OpenAI发布会概览 Ope…

使 el-input 内部的内容紧贴左边

<el-inputv-model"form.invitor"placeholder"PC端的自动取当前账号的手机号"readonlyclass"no-border-input" />::v-deep(.no-border-input .el-input__inner) { border: none; box-shadow: none; padding-left: 0; /* 确保内容紧贴左边 *…

(南京观海微电子)——GH7009开机黑屏案例分析

一、 现象描述&#xff1a; 不良现象: LVDS模组&#xff0c;开机大概2秒后就黑屏。 二、问题分析 等主机进入Kernel 后做以下测试&#xff1a; 1、手动reset LCM 后 可以显示正常&#xff1b; 总结&#xff1a; 1&#xff09;uboot 部分HS 太窄&#xff0c;仅有4个clk宽度&am…

科技云报到:人工智能时代“三大件”:生成式AI、数据、云服务

科技云报到原创。 就像自行车、手表和缝纫机是工业时代的“三大件”。生成式AI、数据、云服务正在成为智能时代的“新三大件”。加之全球人工智能新基建加速建设&#xff0c;成为了人类社会数字化迁徙的助推剂&#xff0c;让新三大件之间的耦合越来越紧密。从物理世界到数字世…