当前位置: 首页 > news >正文

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:主要用于存储用户的会话状态和敏感信息,如登录状态、权限等。

相关文章:

Java Web-Cookie与Session

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

Couchbase UI: Dashboard

以下是 Couchbase UI Dashboard 页面详细介绍,包括页面布局和功能说明,帮助你更好地理解和使用。 1. 首页(Overview) 功能:提供集群的整体健康状态和性能摘要 集群状态 节点健康状况:绿色(正…...

每日 Java 面试题分享【第 13 天】

欢迎来到每日 Java 面试题分享栏目! 订阅专栏,不错过每一天的练习 今日分享 3 道面试题目! 评论区复述一遍印象更深刻噢~ 目录 问题一:如何在 Java 中调用外部可执行程序或系统命令?问题二:如果一个线程…...

探究 Facebook 隐私安全发展方向,未来走向何方?

随着社交媒体的普及,隐私和数据安全问题成为了全球关注的焦点。Facebook,作为全球最大的社交平台之一,其隐私安全问题尤其引人注目。近年来,随着用户数据泄露事件的不断发生,Facebook 不断调整其隐私政策,探…...

第三十一周学习周报

目录 摘要Abstract文献阅读总体架构实验分析 知识复习总结 摘要 在本周阅读的文献中,作者提出了一种基于生成对抗网络(GAN)和长短期记忆网络(LSTM)融合模型的连续管钻井参数预测方法,旨在提高连续管钻井的…...

白嫖一个可以公网访问、带评论和图床的博客系统

这里我来把搭建这个网站的过程记录下&#xff0c;可供新手朋友搭建 完成github page的创建 首先先打开github官网&#xff0c;然后打开your repositories这个标签 然后新建一个repositories&#xff0c;名字是比较特殊的&#xff0c;为<username>.github.io这个格式&am…...

定时器、计数器

定时器&#xff1a;TON TOF TONR&#xff1a;保持型接通定时器 TP:脉冲定时器&#xff1a;触发一次&#xff0c;就开始计时 TP&#xff1a;按下I0.1 TP开始计时&#xff0c;Q电开始有电&#xff0c;时间到Q点失电 计数器&#xff1a;CTU加 CTD减 CTUD加减 两个方法&#xf…...

Ubuntu Server连接wifi

背景 家里服务器放在客厅太吵了, 准备挪到阳台, 所以买了TP wifi接收器, 因此需要配置wifi连接. 刚开始买了Tenda Ax300, 结果不支持服务器系统, 买前还是得和客服交流交流. 准备 驱动安装 对于windows系统来说, 这款接收器是免驱的, 但在linux上需要安装相应型号驱动 安装…...

关于MySQL InnoDB存储引擎的一些认识

文章目录 一、存储引擎1.MySQL中执行一条SQL语句的过程是怎样的&#xff1f;1.1 MySQL的存储引擎有哪些&#xff1f;1.2 MyIsam和InnoDB有什么区别&#xff1f; 2.MySQL表的结构是什么&#xff1f;2.1 行结构是什么样呢&#xff1f;2.1.1 NULL列表&#xff1f;2.1.2 char和varc…...

深入剖析SpringBoot启动机制:run()方法详尽解读

摘要 本文深入解析SpringBoot的启动机制&#xff0c;以run()方法为核心&#xff0c;逐步追踪并详细解释其关键步骤。首先探讨run()方法的工作原理&#xff0c;然后深入代码层面分析各个关键环节。文章提供刷新后钩子和启动后任务的代码示例&#xff0c;帮助读者理解SpringBoot源…...

Nginx中部署多个前端项目

1&#xff0c;准备前端项目 tlias系统的前端资源 外卖项目的前端资源 2&#xff0c;nginx里面的html文件夹中新建&#xff0c;tlias和sky两个文件夹。 切记这是在nginx/html下创建的 mkdir sky mkdir tlias 把tlias和sky的资源都放到对应的文件夹中 3&#xff0c;编辑配置ngi…...

1688寻源通:赋能跨境贸易的高效业务平台

前言 在全球化的浪潮下&#xff0c;跨境电商已成为推动经济发展的重要力量。作为国内领先的B2B电商平台&#xff0c;1688凭借其强大的供应链资源和创新技术&#xff0c;推出了“寻源通”业务&#xff0c;旨在帮助国内供应商和跨境采购商实现更高效、更精准的供需匹配&#xff…...

JVM深入学习(一)

目录 一.JVM概述 1.1 为什么要学jvm&#xff1f; 1.2 jvm的作用 1.3 jvm内部构造 二.JVM类加载 2.1类加载过程 2.2类加载器 2.3类加载器的分类 2.4双亲委派机制 三.运行时数据区 堆空间区域划分&#xff08;堆&#xff09; 为什么分区(代)&#xff1f;&#xff08…...

Qt Creator 15.0.0如何更换主题和字体

1.打开Qt Creator 15.0.0 (Community)&#xff0c; 2.点击编辑栏3.点击Preferences... 4.修改主题&#xff0c;点击环境&#xff0c;修改Theme:栏 5.修改字体大小&#xff0c;点击文本编辑器&#xff0c;修改字号栏。&#xff0c;修改Theme:栏...

“大模型横扫千军”背后的大数据挖掘--浅谈MapReduce

文章目录 O 背景知识1 数据挖掘2 邦费罗尼原则3 TF.IDF4 哈希函数5 分布式文件系统 一、MapReduce基本介绍1. Map 任务2. 按键分组3. Reduce 任务4. 节点失效处理5.小测验&#xff1a;在一个大型语料库上有100个map任务和若干reduce任务&#xff1a; 二、基于MapReduce的基本运…...

shallowRef和shallowReactive的用法以及使用场景和ref和reactive的区别

Vue3 浅层响应式 API 1. ref vs shallowRef 1.1 基本概念 ref: 深层响应式&#xff0c;会递归地将对象的所有属性转换为响应式shallowRef: 浅层响应式&#xff0c;只有 .value 的改变会触发更新&#xff0c;不会递归转换对象的属性 1.2 使用对比 // ref 示例 const deepRe…...

maven、npm、pip、yum官方镜像修改文档

文章目录 Maven阿里云网易华为腾讯云 Npm淘宝腾讯云 pip清华源阿里中科大华科 Yum 由于各博客繁杂&#xff0c;本文旨在记录各常见镜像官网&#xff0c;及其配置文档。常用镜像及配置可评论后加入 Maven 阿里云 官方文档 setting.xml <mirror><id>aliyunmaven&l…...

HTML5+SVG+CSS3实现雪中点亮的圣诞树动画效果源码

源码介绍 这是一款基于HTML5SVGCSS3实现雪中点亮的圣诞树动画效果源码。画面中的圣诞树矗立在雪地中&#xff0c;天上飘落着雪花。当鼠标滑过圣诞树时&#xff0c;可见到圣诞树上的灯光闪烁&#xff0c;同时左下角探出雪怪模样的半个脑袋&#xff0c;四处张望着。整体画面栩栩…...

HTML-新浪新闻-实现标题-样式1

用css进行样式控制 css引入方式&#xff1a; --行内样式&#xff1a;写在标签的style属性中&#xff08;不推荐&#xff09; --内嵌样式&#xff1a;写在style标签中&#xff08;可以写在页面任何位置&#xff0c;但通常约定写在head标签中&#xff09; --外联样式&#xf…...

Linux-day10

第21章 Linux高级篇-日志管理 日志介绍和实例 基本介绍 系统常用的日志 日志服务 日志服务原理图 在这个配置文件里面记录了日志服务程序 日志管理服务rsyslogd -v是反向匹配 invert 日志服务配置文件 时间、主机、是由哪个程序或者服务发生的、事件信息 自定义日志服务 日…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...