Java Web-Cookie与Session

会话跟踪技术

会话跟踪技术是一种在 Web 应用程序中跟踪用户会话状态的机制,它允许服务器在多个请求之间识别和关联属于同一用户的请求,以便在整个会话过程中保持用户相关的信息。以下是几种常见的会话跟踪技术:

Cookie

  • 概念:Cookie 是服务器发送到用户浏览器并保存在本地的一小段数据,以键值对形式存储。浏览器后续向同一服务器发起请求时,会自动在请求头中携带这些 Cookie 数据。
  • 原理:用户访问服务器时,服务器在响应头中通过Set-Cookie字段向浏览器发送 Cookie。浏览器接收后将其存储在本地。之后浏览器每次向该服务器发送请求时,会在请求头的Cookie字段中带上这些 Cookie 信息,服务器据此识别用户状态。
  • 应用场景:用于记录用户偏好、实现自动登录、跟踪用户行为等。

Session

  • 概念:Session 是服务器端用于跟踪用户会话的机制。服务器为每个用户创建一个唯一的 Session 对象,用于存储该用户在整个会话期间的相关数据
  • 原理:用户首次访问服务器时,服务器为其创建一个唯一的 Session ID并通过响应头中的Set-Cookie将该 ID 发送给浏览器,浏览器将其存储在本地的 Cookie 中。后续请求时,浏览器会在请求头的Cookie字段中带上这个 Session ID,服务器根据该 ID 查找对应的 Session 对象,获取和更新用户相关数据。
  • 应用场景:常用于用户认证与授权、购物车功能、多页面表单数据传递等场景。

URL 重写

  • 概念:通过在 URL 中附加会话相关的信息,如 Session ID,来跟踪用户会话。当用户访问一个页面时,服务器将包含 Session ID 的新 URL 返回给浏览器,浏览器在后续请求中使用这个带有 Session ID 的 URL,服务器就可以根据 URL 中的 Session ID 来识别用户会话。
  • 原理:服务器在生成页面的链接时,将 Session ID 作为参数附加到 URL 后面。用户点击链接时,浏览器将包含 Session ID 的 URL 发送给服务器,服务器从 URL 中解析出 Session ID,从而确定用户的会话。
  • 应用场景:当浏览器禁用了 Cookie 时,可以作为替代方案来实现会话跟踪。不过,由于 URL 中携带了会话信息,可能会存在一定的安全风险,且在某些情况下可能会导致 URL 过长。

隐藏表单域

  • 概念:在 HTML 表单中添加一个隐藏的输入字段,用于存储会话相关的信息,如 Session ID。当表单提交时,这个隐藏字段的值也会被发送到服务器,服务器可以根据这个值来跟踪用户会话。
  • 原理:服务器在生成 HTML 页面时,在表单中插入一个隐藏的输入字段,并将 Session ID 等会话信息作为该字段的值。用户提交表单时,浏览器将表单数据包括隐藏字段的值一起发送给服务器,服务器从接收到的表单数据中获取隐藏字段的值,从而识别用户会话。
  • 应用场景:同样可以在 Cookie 被禁用的情况下作为一种补充的会话跟踪方式,但它只能在表单提交时传递会话信息,对于其他类型的请求(如直接访问页面)则无法使用。

一、Cookie

 1.概念介绍

Cookie 是服务器发送到用户浏览器并保存在本地的小段数据,它会在浏览器下次向同一服务器再发起请求时被携带上并发送到服务器上。这些数据可以帮助服务器识别用户身份、记录用户偏好等。

2.基本使用方法

设置 Cookie
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("/setCookie")
public class SetCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 创建一个 Cookie 对象,键为 username,值为 JohnCookie cookie = new Cookie("username", "John");// 设置 Cookie 的有效期为 3600 秒(1 小时)cookie.setMaxAge(3600);// 将 Cookie 添加到响应中resp.addCookie(cookie);resp.getWriter().println("Cookie has been set.");}
}
获取 Cookie
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("/getCookie")
public class GetCookieServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求中的所有 CookieCookie[] cookies = req.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {if ("username".equals(cookie.getName())) {resp.getWriter().println("Username from cookie: " + cookie.getValue());return;}}}resp.getWriter().println("No username cookie found.");}
}

发送请求后控制台输出 

3.原理

当客户端(浏览器)向服务器发送请求时,服务器可以在响应头中添加 Set - Cookie 字段,浏览器接收到响应后会将这些 Cookie 存储在本地。之后,浏览器每次向该服务器发送请求时,都会在请求头中包含 Cookie 字段,将之前存储的 Cookie 信息发送给服务器,服务器根据这些信息进行相应处理。

4.使用细节

  • 有效期:可以通过 setMaxAge() 方法设置 Cookie 的有效期。正数表示多少秒后过期,负数表示浏览器关闭时过期,0 表示立即删除。
  • 作用域:可以通过 setPath 和 setDomain 方法设置 Cookie 的作用路径和作用域名,只有在指定路径和域名下的请求才会携带该 Cookie。
  • 安全性:可以通过 setSecure 方法设置 Cookie 只能通过 HTTPS 协议传输,通过 setHttpOnly 方法设置 Cookie 不能被 JavaScript 脚本访问,防止 XSS 攻击。
  • 存储中文:URL编码

5.应用场景

  • 记录用户偏好:如网站的主题颜色、字体大小等设置。
  • 实现自动登录:存储用户的登录凭证,下次访问时自动登录。
  • 跟踪用户行为:记录用户浏览过的页面等信息,用于分析用户行为。

二、Session 

1.概念介绍

Session 是服务器端的会话机制服务器会为每个客户端(浏览器)创建一个唯一的 Session 对象,用于存储该客户端在整个会话期间的相关数据。客户端通过一个唯一的 Session ID与服务器的 Session 对象进行关联

2.基本使用方法

创建并使用 Session
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/createSession")
public class CreateSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取当前请求的 Session,如果不存在则创建一个新的HttpSession session = req.getSession(true);// 向 Session 中存储一个属性session.setAttribute("userRole", "admin");resp.getWriter().println("Session has been created and attribute set.");}
}
获取 Session 中的数据
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/getSession")
public class GetSessionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取当前请求的 Session,如果不存在则返回 nullHttpSession session = req.getSession(false);if (session != null) {// 从 Session 中获取属性String userRole = (String) session.getAttribute("userRole");if (userRole != null) {resp.getWriter().println("User role from session: " + userRole);} else {resp.getWriter().println("No user role attribute found in session.");}} else {resp.getWriter().println("No session found.");}}
}

3.原理

当客户端第一次访问服务器时,服务器会创建一个新的 Session 对象,并为其生成一个唯一的 Session ID。服务器会将这个 Session ID 通过 Set - Cookie 响应头发送给客户端,客户端将其存储在本地的 Cookie 中。之后客户端每次请求时,都会将这个 Session ID 包含在请求头的 Cookie 字段中发送给服务器,服务器根据这个 Session ID 找到对应的 Session 对象,从而获取和更新会话数据

4.使用细节

  • 活化、钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中(钝化),再次启动服务器后,从文件中加载数据到Session中(活化)。二者保证了服务器重启前后,数据的持久化。应用场景:购物车信息持久留存。
  • 存储位置:Session 数据默认存储在服务器的内存中,但也可以配置存储在数据库或文件系统中,以支持分布式环境。
  • 过期时间:可以通过 setMaxInactiveInterval 方法设置 Session 的最大不活动时间,超过这个时间 Session 会自动失效。或者设置如下图依赖。
  • 销毁:可以通过 invalidate 方法手动销毁 Session。该方法可应用于用户退出登录

5.应用场景

  • 用户认证与授权:存储用户的登录状态和权限信息,在用户访问受保护资源时进行验证。
  • 购物车功能:将用户添加到购物车的商品信息存储在 Session 中,方便用户在购物过程中操作。
  • 多页面表单数据传递:在用户填写多个页面的表单时,将中间数据存储在 Session 中,最后一起处理。

三、Cookie 和 Session 的区别

存储位置
  • Cookie数据存储在客户端(浏览器)
  • Session数据存储在服务器端。
安全性
  • Cookie:由于存储在客户端,容易被篡改或窃取,安全性较低。但可以通过设置安全属性(如 secure 和 HttpOnly)提高安全性。
  • Session:数据存储在服务器端,相对安全。但如果 Session ID 泄露,可能会被攻击者利用。
存储容量
  • Cookie:单个 Cookie 通常限制在 4KB 左右,每个域名下的 Cookie 数量也有限制。
  • Session:存储容量主要取决于服务器的配置,理论上可以存储更多的数据。
生命周期
  • Cookie:可以通过设置 setMaxAge 方法控制有效期,分为会话期 Cookie(浏览器关闭时失效)和持久化 Cookie(指定过期时间)。
  • Session:可以通过 setMaxInactiveInterval 方法设置最大不活动时间,超过时间自动失效,也可以手动销毁。
应用场景侧重点
  • Cookie:更适合存储一些不太敏感的用户偏好信息,方便在不同页面之间共享。
  • Session:主要用于存储用户的会话状态和敏感信息,如登录状态、权限等。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性回归、协同过滤、基于内容过滤、主成分分析(PCA)

线性回归 使用item特征用户打分标签线性回归训练,最小化成本函数,得到每个用户的参数 协同过滤 协同过滤基于一个核心假设:相似的用户会有相似的兴趣,因此可以通过分析相似用户历史行为,来预测当前用户可能感兴趣的i…

WPS数据分析000009

一、函数与数据透视表统计数据时效率差异 函数 F4绝对引用 数据透视表 二、数据透视表基础操作 数据透视表:一个快速的生成报表的工具 显示详细信息 方式一; 方式二: 移动数据透视表 删除数据透视表 复制粘贴数据透视表 留足空间,否则拖动字…

idea实用设置

一.View 1.配置工具包方便按 二.File->Settings 点开设置然后进行后面的配置 1.这个看个人习惯 2.更新 3.更改菜单字体大小 4.鼠标控制字体大小 5.文件默认字体大小 6. 代码的智能提示功能 7.自动导包 8.编码 9.取消双击shift搜索

CE-PBFT:大规模联盟区块链的高可用一致性算法

摘要 区块链已广泛应用于农产品溯源、供应链管理、物流运输等各个领域。作为联盟区块链不可缺少的组成部分,共识算法保证了网络中每个节点的一致性和可信度。然而,由于通信过程的复杂性,现有的大规模联盟区块链场景中的共识算法存在低系统吞…

基于Springboot用axiospost请求接收字符串参数为null的解决方案

问题 ​ 今天在用前端 post 请求后端时发现,由于是以 Json对象的形式传输的,后端用两个字符串形参无法获取到对应的参数值 前端代码如下: axios.post(http://localhost:8083/test/postParams,{a: 1, b:2} ,{Content-Type: application/jso…

【云安全】云原生-K8S-简介

K8S简介 Kubernetes(简称K8S)是一种开源的容器编排平台,用于管理容器化应用的部署、扩展和运维。它由Google于2014年开源并交给CNCF(Cloud Native Computing Foundation)维护。K8S通过提供自动化、灵活的功能&#xf…

【架构面试】一、架构设计认知

涉及分布式锁、中间件、数据库、分布式缓存、系统高可用等多个技术领域,旨在考查候选人的技术深度、架构设计能力与解决实际问题的能力。 1. 以 Redis 是否可以作为分布式锁为例: 用 Redis 实现分布式锁会存在哪些问题? 死锁:如果…

Linux:文件与fd(未被打开的文件)

hello,各位小伙伴,本篇文章跟大家一起学习《Linux:文件与fd(未被打开的文件)》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助&#xf…

流行的开源高性能数据同步工具 - Apache SeaTunnel 整体架构运行原理

概述 背景 数据集成在现代企业的数据治理和决策支持中扮演着至关重要的角色。随着数据源的多样化和数据量的迅速增长,企业需要具备强大的数据集成能力来高效地处理和分析数据。SeaTunnel通过其高度可扩展和灵活的架构,帮助企业快速实现多源数据的采集、…

使用eNSP配置GRE VPN实验

实验拓扑 实验需求 1.按照图示配置IP地址 2.在R1和R3上配置默认路由使公网区域互通 3.在R1和R3上配置GRE VPN,使两端私网能够互相访问,Tunne1口IP地址如图 4.在R1和R3上配置RIPv2来传递两端私网路由 实验步骤 GRE VPN配置方法: 发送端&#x…

C语言的灵魂——指针(1)

指针是C语言的灵魂,有了指针C语言才能完成一些复杂的程序;没了指针就相当于C语言最精髓的部分被去掉了,可见指针是多么重要。废话不多讲我们直接开始。 指针 一,内存和地址二,编址三,指针变量和地址1&#…

【喜讯】海云安荣获“数字安全产业贡献奖”

近日,国内领先的数字化领域独立第三方调研咨询机构数世咨询主办的“2025数字安全市场年度大会”在北京成功举办。在此次大会上,海云安的高敏捷信创白盒产品凭借其在AI大模型技术方面的卓越贡献和突出的技术创新能力,荣获了“数字安全产业贡献…

Couchbase UI: Server

在 Couchbase UI 中的 Server(服务器)标签页主要用于管理和监控集群中的各个节点。以下是 Server 标签页的主要内容和功能介绍: 1. 节点列表 显示集群中所有节点的列表,每个节点的详细信息包括: 节点地址&#xff1…

解决CentOS9系统下Zabbix 7.2图形中文字符乱码问题

操作系统:CentOS 9 Zabbix版本:Zabbix7.2 问题描述:主机图形中文字符乱码 解决方案: # 安装字体配置和中文语言包 sudo yum install -y fontconfig langpacks-zh_CN.noarch # 检查是否已有中文字体: fc-list :lan…

git gui 笔记

这里写目录标题 1. [下载安装git](https://blog.csdn.net/jiesunliu3215/article/details/111559125)2. [下载Git Gui](https://git-scm.com/downloads)3. 上传下载代码4. 创建版本5. 版本切换-checkout参考狂神说 git教程 -讲的是真的好gitee的git帮助 其他 1. 下载安装git 2…

HTML-新浪新闻-实现标题-排版

标题排版 图片标签&#xff1a;<img> src&#xff1a;指定图片的url&#xff08;绝对路径/相对路径&#xff09; width&#xff1a;图片的宽度&#xff08;像素/相对于父元素的百分比&#xff09; heigth&#xff1a;图片的高度&#xff08;像素/相对于父元素的百分比&a…

【太阳——几何计算】

题目 代码 #include <bits/stdc.h> using namespace std; using PII pair<int, int>; using ll long long; const int N 1e5 10; set<PII> s; bool st[N]; struct node {int x, y, id; } arr[2 * N]; int main() {int n, X, Y;cin >> n >> …

2025美赛美国大学生数学建模竞赛A题完整思路分析论文(43页)(含模型、可运行代码和运行结果)

2025美国大学生数学建模竞赛A题完整思路分析论文 目录 摘要 一、问题重述 二、 问题分析 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码&#xff08;仅供参考&#xff09; 4.1.4问题1样例代码运行结果&…

面向长文本的多模型协作摘要架构:多LLM文本摘要方法

多LLM摘要框架在每轮对话中包含两个基本步骤:生成和评估。这些步骤在多LLM分散式摘要和集中式摘要中有所不同。在两种策略中,k个不同的LLM都会生成多样化的文本摘要。然而在评估阶段,多LLM集中式摘要方法使用单个LLM来评估摘要并选择最佳摘要,而分散式多LLM摘要则使用k个LLM进行…

docker 部署 java 项目详解

在平常的开发工作中&#xff0c;我们经常需要部署项目&#xff0c;开发测试完成后&#xff0c;最关键的一步就是部署。今天我们以若依项目为例&#xff0c;总结下部署项目的整体流程。简单来说&#xff0c;第一步&#xff1a;安装项目所需的中间件&#xff1b;第二步&#xff1…