Java Web-Cookie与Session

embedded/2025/1/31 6:46:34/

会话跟踪技术

会话跟踪技术是一种在 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
java">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
java">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
java">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 中的数据
java">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.ppmy.cn/embedded/158272.html

相关文章

51单片机开发:定时器中断

目标:利用定时器中断,每隔1s开启/熄灭LED1灯。 外部中断结构图如下图所示,要使用定时器中断T0,须开启TE0、ET0。: 系统中断号如下图所示:定时器0的中断号为1。 定时器0的工作方式1原理图如下图所示&#x…

windows怎么查看进程运行时的参数?

1、查看进程列表 在Windows中,可以使用命令行工具tasklist查看运行的进程列表。 2、查看运行的进程的参数 可以使用wmic命令查看进程的详细信息,包括参数。 打开命令提示符(CMD)或PowerShell,并输入以下命令&#xf…

02-机器学习-核心概念

以下是机器学习核心概念的详细梳理。 1. 机器学习三大范式 类型定义典型应用监督学习使用带标签的数据训练模型,预测未知数据的标签。分类(邮件垃圾过滤)、回归(房价预测)无监督学习从无标签的数据中发现隐藏模式或结…

学习数据结构(2)空间复杂度+顺序表

1.空间复杂度 (1)概念 空间复杂度也是一个数学表达式,表示一个算法在运行过程中根据算法的需要额外临时开辟的空间。 空间复杂度不是指程序占用了多少bytes的空间,因为常规情况每个对象大小差异不会很大,所以空间复杂…

webview_flutter_android 4.3.0使用

webview_flutter_android 4.3.0 使用简介 版本:适合未使用前的阅读 文档应包含以下10个核心章节: 一、核心类说明二、参数类型详解三、高级配置API四、性能优化配置五、调试工具六、必要配置七、扩展功能与辅助类八、生命周期管理九、高级交互示例十、…

51单片机密码锁代码

基于液晶屏外设写的. main.c #include <REGX52.H> #include "LCD1602.h" #include "MatrixKey.h" #include "Sleep.h" long password1234; long resNum0; int status0,res0,k1500; long birth2005; void main(){LCD_Init();LCD_ShowStr…

C++并发编程指南08

以下是经过优化排版后的5.3节内容&#xff0c;详细解释了C中的同步操作和强制排序机制。每个部分都有详细的注释和结构化展示。 文章目录 5.3 同步操作和强制排序假设场景示例代码 5.3.1 同步发生 (Synchronizes-with)基本思想 5.3.2 先行发生 (Happens-before)单线程环境多线程…

前端(数据可视化低代码平台)AI

前端&AI 前端与AI&#xff08;人工智能&#xff09;相互促进、深度融合&#xff0c;有着紧密的关系&#xff0c;以下是具体阐述&#xff1a; 前端为AI提供展示与交互平台 • 数据展示&#xff1a;前端可将AI处理和分析后的数据&#xff0c;通过图表、图形等可视化方式呈…