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

Servlet技术之Cookie对象与HttpSession对象

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
Servlet技术之Cookie对象与HttpSession对象


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
  • 一、Cookie对象与HttpSession对象的介绍
    • Cookie介绍
    • Cookie对象的特点
    • HttpSession介绍
    • HttpSession对象的特点
  • 二、对象的使用
    • Cookie对象的使用
      • Cookie对象的创建
      • 获取Cookie的数据
      • 状态Cookie和持久化Cookie
      • 解决Cookie中文乱码
    • HttpSession对象的使用
      • HttpSession对象的创建
      • HttpSession对象的使用
      • HttpSession对象的销毁方式
        • 默认时间到期
        • 手动销毁
      • HttpSession生命周期
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

在博客应用程序中,用户的登录状态、偏好设置等信息需要在多个页面之间进行传递和共享。在 Servlet 技术中,我们可以使用 Cookie 对象和 HttpSession 对象来实现这一目标。
Cookie 对象是一种在客户端存储少量数据的机制,它将数据以键值对的形式存储在用户的浏览器中。通过设置和获取 Cookie 对象,我们可以在客户端和服务器之间传递一些简单的状态信息。
而 HttpSession 对象则是一种在服务器端存储用户会话信息的机制,它将用户的会话信息存储在服务器的内存中,并为每个用户创建一个唯一的会话标识。通过 HttpSession 对象,我们可以在多个页面之间共享用户的会话信息,例如登录状态、购物车信息等。
在博客应用程序中,我们可以使用 Cookie 对象来存储用户的登录状态,以便在用户下次访问时自动登录。同时,我们也可以使用 HttpSession 对象来存储用户的偏好设置、博客文章等信息,以便在多个页面之间进行共享。
在接下来的博客中,我们将深入探讨 Cookie 对象和 HttpSession 对象的使用方法、注意事项以及在博客应用程序中的实际应用。希望这些内容能够帮助你更好地理解和应用 Servlet 技术,开发出更加优秀的博客应用程序。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Cookie对象与HttpSession对象的介绍

Cookie对象和HttpSession对象都是用于在 Web 应用程序中存储和管理状态信息的机制。

Cookie介绍

Cookie对象是一种在客户端存储少量数据的机制,它将数据以键值对的形式存储在用户的浏览器中。Cookie通常用于存储用户的登录状态、偏好设置等信息,以便在后续的请求中进行传递和使用。
Cookie对象具有以下几个重要属性和方法:

  • name:Cookie的名称,用于标识Cookie。
  • value:Cookie的值,可以是任意类型的数据。
  • domain:Cookie的作用域,可以指定为当前域名或子域名。
  • path:Cookie的路径,默认为当前路径。
  • expiry:Cookie的过期时间,默认为浏览器关闭时失效。

通过设置Cookie对象的这些属性,可以将Cookie添加到响应中,并在后续的请求中通过请求对象获取到相应的Cookie值。

Cookie对象的特点

  • 存储在客户端:Cookie 是由服务器发送给客户端的一小段文本数据,通常包含一些关于用户或会话的信息。客户端(通常是浏览器)会将 Cookie 存储在本地,以便在后续的请求中携带给服务器。
  • 键值对的形式:Cookie 以键值对的形式存储数据,其中键(Cookie 的名称)和值(Cookie 的内容)都是字符串。
  • 持久性:Cookie 可以设置过期时间,过期时间决定了 Cookie 在客户端的存活时间。如果没有设置过期时间,Cookie 将在浏览器关闭时失效。过期时间可以是特定的日期和时间,也可以是相对时间(例如几天后过期)。
  • 储存大小:单个Cookie存储数据大小限制在4097个字节
  • 跨域限制:默认情况下,浏览器不允许一个域的脚本访问其他域设置的 Cookie。这是为了防止跨站脚本攻击(CSRF)等安全问题。但是,可以通过一些配置(如 CORS)来允许跨域访问。
  • 保存地址:Cookie对象保存在客户端浏览器内存或系统磁盘中
  • Cookie分为持久化Cooke与状态Cookie

HttpSession介绍

HttpSession对象是一种在服务器端存储用户会话信息的机制,它将用户的会话信息存储在服务器的内存中,并为每个用户创建一个唯一的会话标识。HttpSession通常用于存储用户的登录状态、购物车信息等,以便在多个页面之间共享和使用。
HttpSession对象具有以下几个重要方法和属性:

  • getId():获取当前会话的唯一标识。
  • setAttribute(String name, Object value):将对象存储在当前会话中,并指定一个键来检索它。
  • getAttribute(String name):获取存储在当前会话中的对象,通过指定的键来检索它。
  • removeAttribute(String name):从当前会话中移除指定键对应的对象。

需要注意的是,Cookie是存储在客户端浏览器中的,因此存在一定的安全性风险。为了保护用户的隐私和安全,应尽量避免在Cookie中存储敏感信息,并设置适当的过期时间。而HttpSession是存储在服务器端的,相对来说更加安全,但也需要注意会话的超时时间和管理。

HttpSession对象的特点

  • 服务器端存储:HttpSession是在服务器端存储的对象,与特定的用户会话相关联。服务器会为每个用户创建一个独立的HttpSession对象,并在用户的会话期间维护该对象。
  • 会话标识符:HttpSession通过一个唯一的会话标识符(Session ID)来标识每个用户的会话。当客户端发送请求时,会将这个会话标识符传递给服务器,服务器通过它来找到对应的HttpSession对象。
  • 生命周期:HttpSession的生命周期与用户的会话相关联。通常情况下,一个会话在用户关闭浏览器或经过一段时间的不活动后会超时。超时时间可以通过服务器端的配置来设置。
  • HttpSession存储数据大小无限制
  • 跨页面共享:存储在HttpSession中的数据可以在同一用户的多个页面之间共享。只要这些页面属于同一个会话,它们都可以通过HttpSession对象来访问和修改共享的数据。

二、对象的使用

Cookie对象的使用

Cookie对象的创建

Cookie cookie = new Cookie("key","value");
//通过new关键字创建Cookie对象
response.addCookie(cookie)
//通过HttpServletResponse对象将Cookie写回给客户端浏览器。

获取Cookie的数据

浏览器每次请求时都会把与当前访问的域名相关的Cookie在请求中提交到服务端。通过HttpServletRequest对象获取Cookie,返回Cookie数组。

Cookie[] cookies = request.getCookies();

状态Cookie和持久化Cookie

  • 状态Cookie:Cookie对象仅会被缓存在浏览器所在的内存中。当浏览器关闭后Cookie对象 也会被销毁。
  • 持久化Cookie:浏览器会对Cookie做持久化处理,基于文件形式保存在系统的指定目录中。在Windows10系统中为了安全问题不会显示Cookie中的内容。

状态Cookie仅会被缓存在浏览器所在的内存中,当浏览器关闭后Cookie对象也会被销毁。要将状态Cookie变为持久化Cookie,可以使用Cookie.setMaxAge()方法设置失效时间,单位为秒,一旦设置了失效时间,那么该Cookie就会被浏览器持久化到磁盘中,当失效时间到达后文件会被删除。
需要注意的是,设置Cookie的失效时间需要谨慎,因为这可能会导致用户的隐私信息被泄露。如果你有这方面的需求,建议咨询专业的安全机构或法律专业人士。

解决Cookie中文乱码

URLEncoder.encode(“content”,“code”),将内容按照指定的编码方式做URL编码处理。如:

Cookie cookie = new Cookie("key",URLEncoder.encode("value","utf-8"));

URLDecoder.decode(“content”,“code”),将内容按照指定的编码方式做URL解码处理。如:

URLDecoder.decode("编码后的字符串", "UTF-8"); // 解码

HttpSession对象的使用

HttpSession对象的创建

HttpSession对象的创建过程通常由 Web 容器(如 Tomcat、Jetty 等)负责。当客户端首次发送请求到服务器时,服务器会检查请求中是否包含会话标识符(Session ID)。如果请求中没有会话标识符,服务器会生成一个唯一的会话标识符,并将其作为响应的一部分返回给客户端。客户端会将这个会话标识符保存在浏览器中,以后的请求都会携带这个会话标识符。
当服务器接收到带有会话标识符的请求时,它会根据会话标识符查找对应的HttpSession对象。如果找到了对应的HttpSession对象,服务器会将该请求与该会话关联起来,并可以通过HttpSession对象来访问和修改存储在会话中的数据。如果找不到对应的HttpSession对象,服务器会创建一个新的HttpSession对象,并将其与当前请求关联起来。
下面是一个简单的 Java 代码示例,演示了如何在服务器端获取HttpSession对象:

import javax.servlet.http.HttpSession;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/sessionExample")
public class SessionExampleServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取 HttpSession 对象HttpSession session = request.getSession();// 可以通过 HttpSession 对象访问和修改会话数据String username = (String) session.getAttribute("username");if (username == null) {username = "匿名用户";}response.getWriter().println("欢迎," + username);}
}

注意:getSession()方法还有一个重载方法getSession(true|false)。当参数为true时与getSession()方法作用相同。当参数为false时则只去根据jsessionid查找是否有与这个客户端浏览器对应的HttpSession,如果有则返回,如果没有jsessionid则不会创建新的HttpSession对象。

HttpSession对象的使用

session.setAttribute("key",value);
//将数据存储到HttpSession对象中
Object value = session.getAttribute("key");
//根据key获取HttpSession中的数据,返回Object
Enumeration attributeNames = session.getAttributeNames();
//获取HttpSession中所有的key,返回枚举类型
session.removeAttribute("key");
//根据key删除HttpSession中的数据
String id = session.getId();
//根据获取当前HttpSession的SessionID,返回字符串类型

HttpSession对象的销毁方式

默认时间到期

服务器会为每个HttpSession对象设置一个默认的过期时间,一旦超过这个时间,服务器就会自动销毁该对象。我们可以在web.xml中设置超时时间,单位为分钟

<session-config><session-timeout>1</session-timeout>
</session-config>
手动销毁

直接调用HttpSession对象的invalidate()方法,可以使HttpSession立即失效

HttpSession生命周期

HttpSession生命周期中没有固定的创建和销毁时间。当我们第一次调用getSession()或者getSession(true)的时候,这是HttpSession便创建了;当会话超时或者调用了invalidate()方法,则会话销毁。

总结

提示:这里对文章进行总结:

总之,在选择使用Cookie还是HttpSession时,需要考虑数据的安全性、存储大小、有效期等因素。对于不敏感的、较小的数据,可以选择使用Cookie;对于敏感的、较大的数据,或者需要在多个页面之间共享的数据,可以选择使用HttpSession。

相关文章:

Servlet技术之Cookie对象与HttpSession对象

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 Servlet技术之Cookie对象与HttpSession对象 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前…...

winlogbeat收集Windows事件日志传给ELK

服务器部署winlogbeat后&#xff0c;修改winlogbeat.yml: ###################### Winlogbeat Configuration Example ######################### This file is an example configuration file highlighting only the most common # options. The winlogbeat.reference.yml fi…...

Gin框架之使用 go-ini 加载.ini 配置文件

首先,联想一个问题,我们在部署服务时,通常为了方便,对于需要迭代更新的代码进行修改,但是比对shell,可以搞一个变量将需要修改的,以及修改起来变动处多的,写在变量内,到时候如果需要变更,可以直接变更变量即可; 那么,golang有没有什么方式可以将需要变的东西保存起…...

SpringMVC:整合 SSM 上篇

文章目录 SpringMVC - 03整合 SSM 上篇一、准备工作二、MyBatis 层1. dao 层2. service 层 三、Spring 层四、SpringMVC 层五、执行六、说明 SpringMVC - 03 整合 SSM 上篇 用到的环境&#xff1a; IDEA 2019&#xff08;JDK 1.8&#xff09;MySQL 8.0.31Tomcat 8.5.85Maven…...

BFS解决多源最短路相关leetcode算法题

文章目录 1.01矩阵2.飞地的数量3.地图中的最高点4.地图分析 1.01矩阵 01矩阵 class Solution {int dx[4] {0,0,1,-1};int dy[4] {1,-1,0,0}; public:vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {//正难则反&#xff0c;找0…...

ARM GIC(四) gicv3架构基础

GICv3架构是GICv2架构的升级版&#xff0c;增加了很多东西。变化在于以下&#xff1a; 使用属性层次&#xff08;affinity hierarchies&#xff09;&#xff0c;来对core进行标识&#xff0c;使gic支持更多的core 将cpu interface独立出来&#xff0c;用户可以将其设计在core…...

Kafka日志

位置 server.properties配置文件中通过log.dir指定日志存储目录 log.dir/{topic}-{partition} 核心文件 .log 存储消息的日志文件&#xff0c;固定大小为1G&#xff0c;写满后会新增一个文件&#xff0c;文件名表示当前日志文件记录的第一条消息的偏移量。 .index 以偏移…...

gitattributes配置文件的作用

0 Preface/Foreword 0.1 基本概念 Git版本管控工具功能强大&#xff0c;在使用过程中&#xff0c;在多人合作的项目开发过程中&#xff0c;经常会遇到提交代码时出现的warning提醒&#xff0c;尤其是换行符。 Linux/Unix/Mac OS操作系统的换行符使用LF符号&#xff08;\n&am…...

【华为鸿蒙系统学习】- 如何利用鸿蒙系统进行App项目开发|自学篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 创建鸿蒙第一个App项目 项目创建 工程目录区 预览区 运行Hello World 基本工程目录 ws:工程…...

基于SpringBoot的足球社区管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的足球社区管理系统,java…...

ubuntu22.04上安装charles-proxy

在 Ubuntu 22.04 上安装 .tar.gz 格式的 Charles Proxy (charles-proxy-4.6.5_amd64.tar.gz) 需要解压缩文件并运行其中的安装脚本或可执行文件。以下是具体步骤&#xff1a; 1. 下载文件 假设你已经从 Charles Proxy 官网下载了 charles-proxy-4.6.5_amd64.tar.gz 文件。 2…...

(2021|CVPR,XMC-GAN,对比学习,注意力自调制)用于文本到图像生成的跨模态对比学习

Cross-Modal Contrastive Learning for Text-to-Image Generation 公众&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 基础 4. 方法 4.1 用于文本到图像…...

【Linux基本命令】

文章目录 一. Linux基本命令第三回二. 结束语 一. Linux基本命令第三回 cal指令&#xff0c;命令格式&#xff1a;cal 【参数】【月份】【年份】 功能&#xff0c;用于查看日历等时间信息&#xff0c;如只有一个参数&#xff0c;则表示年份&#xff0c;有两个参数则表示月份和…...

Wi-Fi、蓝牙、ZigBee等多类型无线连接方式的安全物联网网关设计

随着物联网和云计算技术的飞速发展.物联网终端的数量越来越多&#xff0c;终端的连接方式也更趋多样化&#xff0c;比如 Wi-Fi蓝牙和 ZigBee 等。现有的物联网网关大多仅支持一种或者几种终端的接人方式。无法满足终端异构性的需求。同时&#xff0c;现有的物联网网关与终端设备…...

华清远见嵌入式学习——ARM——作业4

作业要求&#xff1a; 代码运行效果图&#xff1a; 代码&#xff1a; do_irq.c: #include "key_it.h" extern void printf(const char *fmt, ...); unsigned int i 0;//延时函数 void delay(int ms) {int i,j;for(i0;i<ms;i){for(j0;j<2000;j);} }void do_i…...

25. K 个一组翻转链表

题解参考&#xff1a;https://leetcode.cn/problems/reverse-nodes-in-k-group/solutions/10416/tu-jie-kge-yi-zu-fan-zhuan-lian-biao-by-user7208t/ 设置dummy虚拟头节点&#xff0c;pre为待翻转部分的前驱&#xff08;用于连接&#xff09;&#xff0c;end为待翻转部分中的…...

jQuery的事件-动画-AJAX和插件

一、jQuery事件处理 1.认识事件&#xff08;Event&#xff09; Web页面经常需要和用户之间进行交互&#xff0c;而交互的过程中我们可能想要捕捉这个交互的过程&#xff1a; 比如用户点击了某个按钮、用户在输入框里面输入了某个文本、用户鼠标经过了某个位置&#xff1b;浏…...

【开源】基于JAVA语言的企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…...

遗传算法的应用——求解一元函数的极值

遗传算法的应用——求解一元函数的极值 1 基本概念2 预备知识3.1 模拟二进制转化为十进制的方法3.2 轮盘赌选择算法 3 问题4 Matlab代码5 运行效果6 总结 1 基本概念 遗传算法(Genetic Algorithm,GA)是模拟生物在自然环境中遗传和进化过程从而形成的随机全局搜索和优化方法&am…...

Power BI 学习

数据获取 数据清洗 对导入的数据进行数据整理的过程一般称为「数据清洗」&#xff0c;之所以称之为清洗&#xff0c;是因为在数据分析师眼中&#xff0c;杂乱的数据就是脏数据&#xff0c;只有被清洗成干净的数据后才可以进行分析使用。 数据丰富 操作 1.复制列 点击列名选…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...