cookie 和 httpSession

news2024/9/19 10:33:51

目录

1.认识Cookie对象与HttpSession

1.1概念

1.2会话管理

2.cookie的使用

2.1cookie使用机制 

2.2cookie不同属性的含义

 

2.2修改或者删除Cookie

2.3 Cookie对象的特点

2.4 Cookie对象的创建

2.5 Cookie中数据的获取

2.6 Cookie不支持中文的解决方案

2.7持久化Cookie和状态Cookie

2.8Cookie跨域问题

3.cookie的案例

​编辑

4.httpSession的使用

4.1 HttpSession的工作原理

4.2HttpSession对象的特点

 4.3HttpSession对象的创建

 4.4HttpSession中数据的获取

4.5HttpSession的销毁

 4.6HttpSession生命周期

4.7HttpSession的使用注意事项

5.httpSession的案例

6.服务器端Session、客户端Session和Cookie的区别


1.认识Cookie对象与HttpSession

1.1概念

Cookie对象与HttpSession对象是维护客户端浏览器与服务端的会话状态的两个对象。由于HTTP协议是一个无状态的协议,所以服务端并不会记录当前客户端浏览器的访问状态,但是在有些时候我们是需要服务端能够记录客户端浏览器的访问状态的。

cookie是产生与服务端,保存在客户端的一种技术,它是以键值对的形式来保存少量文本,他的大小最多只有4K.通过每次http请求时携带这些存储的少量文本数据的方式来与服务端交互,以实现所谓状态记录的效果。

httpSession简称session,它是产生与服务端,并保存于服务端的一种技术,也是以键值对的形式来保存数据,不过相较于cookie保存的数据更多。,第一请求时,服务器会创建HttpSession,我们可以在HttpSession对象中保存一些关于用户的状态信息。

1.2会话管理

  • 一般多数情况下,是这样描述的:用户打开浏览器,在浏览器上进行一些操作,然后将浏览器关闭,表示一次会话结束。
  • 本质上的描述:从session对象的创建,到最终session对象超时之后销毁,这个才是真正意义的一次完整会话。

2.cookie的使用

2.1cookie使用机制 

维度1.每次都会被浏览器自动放在http请求头中存放多个cookie

维度2,.存储在cookie中的数据(1个键值对),每次都会被浏览器自动放在http请求头中,当然这个数据要是太大,会增加网络开销。如果这些数据并不是每个请求都需要发给服务端的数据,浏览器这设置自动处理无疑增加了网络开销;但如果这些数据是每个请求都需要发给服务端的数据(比如身份认证信息),浏览器这设置自动处理就大大免去了服务器的重复处理逻辑。所以对于那设置“每次请求都要携带的信息(最典型的就是身份认证信息)”就特别适合放在cookie中,其他类型的数据就不适合了。

2.2cookie不同属性的含义

 

 可见response httpHeader中返回了所有的 Cookie, Request Headers中包含了所有Cookie。Cookie是以键值对的形式存储的(name和value)。当然对于一个完整cookie来说除了name,value还有其他的属性,下面是整理出来的几个常用属性。

 

当maxAge属性为负数,则表示该Cookie只是一个临时Cookie,不会被持久化,仅在本浏览器窗口或者本窗口打开的子窗口中有效,关闭浏览器后该Cookie立即失效。

        Cookie cookie = new Cookie("mcrwayfun",System.currentTimeMillis()+"");
        // MaxAge为负数,是一个临时Cookie,不会持久化
        cookie.setMaxAge(-1);
        resp.addCookie(cookie);

可以看到,当MaxAge为-1时,时间已经过期

那么maxAge设置为负值和0到底有什么区别呢?

maxAge设置为0表示立即删除该Cookie,如果在debug的模式下,执行上述方法,可以看见cookie立即被删除了。

maxAge设置为负数,能看到Expires属性改变了,但Cookie仍然会存在一段时间直到关闭浏览器或者重新打开浏览器。
 

2.2修改或者删除Cookie

HttpServletResponse提供的Cookie操作只有一个addCookie(Cookie cookie),所以想要修改Cookie只能使用一个同名的Cookie来覆盖原先的Cookie。如果要删除某个Cookie,则只需要新建一个同名的Cookie,并将maxAge设置为0,并覆盖原来的Cookie即可。

新建的Cookie,除了value、maxAge之外的属性,比如name、path、domain都必须与原来的一致才能达到修改或者删除的效果。否则,浏览器将视为两个不同的Cookie不予覆盖。

值得注意的是,从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name和value属性,maxAge属性只被浏览器用来判断Cookie是否过期,而不能用服务端来判断。

我们无法在服务端通过cookie.getMaxAge()来判断该cookie是否过期,maxAge只是一个只读属性,值永远为-1。当cookie过期时,浏览器在与后台交互时会自动筛选过期cookie,过期了的cookie就不会被携带了。

2.3 Cookie对象的特点

  Cookie使用字符串存储数据

Cookie使用Key与Value结构存储数据

 单个Cookie存储数据大小限制在4097个字节

 Cookie存储的数据中不支持中文,Servlet4.0中支持

 Cookie是与域名绑定所以不支持跨一级域名访问(默认只能在站内使用)

Cookie对象保存在客户端浏览器内存上或系统磁盘中

Cookie分为持久化Cookie(保存在磁盘上)与状态Cookie(保存在内存上)

浏览器在保存同一域名所返回Cookie的数量是有限的。不同浏览器支持的数量不同,Chrome浏览器为50个

浏览器每次请求时都会把与当前访问的请求中的所有的Cookie,提交到服务端。一个cookie只存储一个键值对。一个请求中可存储多个cookie。

2.4 Cookie对象的创建

Cookie cookie = new Cookie("key","value")
服务端(后台代码)通过new关键字创建Cookie对象

response.addCookie(cookie)

服务端(后台代码)通过HttpServletResponse对象将Cookie传递给客户端浏览器。

2.5 Cookie中数据的获取

通过HttpServletRequest对象获取Cookie,返回Cookie数组。

Cookie[] cookies = request.getCookies()

可见cookie的获取前端可以获取,后台也可以获取,只需要从httpServletRequest中拿就行。

2.6 Cookie不支持中文的解决方案

在Servlet4.0版本之前的Cookie中是不支持中文存储的,如果存储的数据中含有中文,代码会直接出现异常。我们可以通过对含有中文的数据重新进行编码来解决该问题。在Servlet4.0中的Cookie是支持中文存储的。

 
 
可以使用对中文进行转码处理

URLEncoder.encode("content","code")

将内容按照指定的编码方式做URL编码处理。

URLDecoder.decode("content","code")

将内容按照指定的编码方式做URL解码处理。

2.7持久化Cookie和状态Cookie

状态Cookie:浏览器会缓存Cookie对象。浏览器关闭后Cookie对象销毁。

持久化Cookie:浏览器会对Cookie做持久化处理,基于文件形式保存在系统的指定目录中。在Windows10系统中为了安全问题不会显示Cookie中的内容。

当Cookie对象创建后默认为状态Cookie。可以使用Cookie对象下的cookie.setMaxAge(60)方法设置失效时间,单位为秒。一旦设置了失效时间,那么该Cookie为持久化Cookie,浏览器会将Cookie对象持久化到磁盘中。当失效时间到达后文件删除。

2.8Cookie跨域问题

3.cookie的案例

package org.example;

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;

/**
 * @Author:
 * @Description: MircoMessage:Mark_7001
 */
@WebServlet(urlPatterns = "/servlet3.do")
public class Servlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 通过响应对象,向浏览器响应一些Cookie
        Cookie c1 = new Cookie("age", "10");// 状态Cookie 重启即清除
        Cookie c2 = new Cookie("gender", "男");// 持久化Cookie 让浏览器保留1分钟
        c2.setMaxAge(60);// 秒钟    持久化Cookie 让浏览器保留1分钟
        resp.addCookie(c1);
        resp.addCookie(c2);
    }
}

package com.mashibing.test;
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 javax.xml.ws.WebEndpoint;
import java.io.IOException;
/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
@WebServlet(urlPatterns = "/servlet2.do")
public class Servlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 读取请求中的Cookie
        Cookie[] cookies = req.getCookies();
        //cookies不为null
        if(null != cookies){
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName()+"="+cookie.getValue());
            }
        }
    }
}

4.httpSession的使用

4.1 HttpSession的工作原理

在这里插入图片描述

 

 1. 打开浏览器,在浏览器上发送首次请求
 2. 服务器会创建一个HttpSession对象,该对象代表一次会话
 3. 同时生成HttpSession对象对应的Cookie对象,如果服务器是tomcat ,则Cookie对象的name是jsessionid,Cookie的value是32位长度的字符串(jsessionid=xxxx)。Tomcat提供jsessionId值得生成方式:随机数+时间戳+jvmid.

        另外,session的使用是离不开cookie的,因为session的key 是通过Cookie的方式传给浏览器的。
 4. 服务器将Cookie的value和HttpSession对象绑定到session列表中
 5. 服务器将Cookie完整发送给浏览器客户端
 6. 浏览器客户端将Cookie保存到缓存中
 7. 只要浏览器不关闭,Cookie就不会消失
 8. 当再次发送请求的时候,会自动提交缓存中当的Cookie
 9. 服务器接收到Cookie,验证该Cookie的name是否是jsessionid,如是,则获取该Cookie的value
 10. 通过Cookie的value去session列表中检索对应的HttpSession对象 

分析一下,如果我们在HttpSession对象中保存一些关于用户的状态信息,那么有了session技术后,不就可以让http协议,或者说请求有了状态嘛。

要注意的是:
当浏览器关闭之后,缓存中的cookie消失,这样客户端下次再访问服务器的时候就无法获取到服务器端的session对象了。这就意味着会话已经结束,但是并不代表服务器端的session对象马上被回收,session对象仍然在session列表中存储,当长时间没有用户访问这个session对象了,我们称作session超时,此时web服务器才会回收session对象。
 

4.2HttpSession对象的特点

HttpSession保存在服务端

HttpSession可以存储任何类型的数据

HttpSession使用Key与Value结构存储数据 value是Object类型

HttpSession存储数据大小无限制

 4.3HttpSession对象的创建

HttpSession对象的创建是通过request.getSession()方法来创建的。客户端浏览器在请求服务端资源时,如果在请求的cookie中没有key为jesessionId的cookie,getSession()方法将会为这个客户端浏览器创建一个新的HttpSession对象,并将这个对象放入session map表中,同时会对应的生成一个key为jessionId(如果是tomcat服务器的话),value为32位长度的字符串的cookie。这个cookie和session的关系是,

cookie的key是固定的"jessionId",cookie的value是session对象在session map表中的key。

然后在响应中通过Cookie写回给客户端浏览器。
 

浏览器再次请求服务器时,如果在请求中包含了key为jesessionId的cookie,则获取该Cookie的value。通过Cookie的value去session列表中检索对应的HttpSession对象 。然后返回,然后进行业务上的逻辑处理。如果sessiono map 表中 没有SessionID,则getSession()方法将会为这个客户端浏览器创建一个新的HttpSession对象

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

 

 4.4HttpSession中数据的获取

将数据存储到HttpSession对象中

session.setAttribute("key",value)

根据key获取HttpSession中的数据,返回Object

Object value = session.getAttribute("key")

获取HttpSession中所有的key,返回枚举类型

Enumeration<String> attributeNames = session.getAttributeNames()

根据key删除HttpSession中的数据

session.removeAttribute("key")

根据获取当前HttpSession的SessionID,返回字符串类型

String id = session.getId()

4.5HttpSession的销毁

当很长一段时间(这个时间可以配置)没有用户再访问session对象,此时session对象超时,web服务器会自动回收session对象
可以配置这个超时时间,在web.xml文件中,其默认是30分钟
<session-config> <session-timeout>120</session-timeout> </session-config>

3、那什么情况下才是一次会话结束呢?
1.浏览器关闭,缓存中的Cookie消失,会话不一定结束,因为服务器端session对象还没有被销毁。这时我们可以通过URL重写机制继承访问session对象。
2. 浏览器没关闭,但是由于长时间没有访问web服务器,服务器判定session超时,将session对象销毁。此时浏览器虽然没有关闭,但是这次会话已经结束。
3. session对象所关联的这个Cookie的name有点特殊,这个name必须是jsessionid全部小写,这时HTTP协议规定的。
4.浏览器禁用了Cookie,可以采用URL重写机制(这样编码的代价比较大,所以一般网站都是不允许禁用Cookie的)
5.怎么重写URL:http://ip:port/webapp/servlet/accessSys;jsessionid=xxxxxx
————————————————
版权声明:本文为CSDN博主「@烟雨倾城ゝ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hcz666/article/details/108916119

 4.6HttpSession生命周期

4.7HttpSession的使用注意事项

5.httpSession的案例

6.服务器端Session、客户端Session和Cookie的区别

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第五天 | 哈希表系列1(哈希表理论基础--有效的字母异位词--快乐数)

哈希表系列1 哈希表理论基础242 有效的字母异位词读题小记代码随想录的代码力扣的示例代码 基于242的拓展题目--383赎金信我的代码力扣的示例代码代码随想录的代码 49 字母异位词分组力扣中录友的代码我的代码力扣的示例代码 438 找到字符串中所有字母异位词我的代码力扣录友的…

四、交换网络实验2——创建VLAN及端口配置

更多网络基础内容可见: 网络基础学习目录及各章节指引 4.6.2 创建VLAN及端口配置 实验目的 学习VLAN的创建删除 实验工具 Cisco Packet Tracer 实验环境 安装模拟器的Windows系统 实验步骤 第一步,vlan的创建

【实战】 六、用户体验优化 - 加载中和错误状态处理(上) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(八)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理1.给页面添加 …

web接口开发与测试——你了解多少

目录 前言 Django快速开发之投票系统 编写接口文档 系统接口测试 总结&#xff1a; 前言 最近一直在学习和整理web开发与接口测试的相关资料。接口测试本身毫无任何难度&#xff0c;甚至有很多工具和类库来帮助我们进行接口测试。大多测试人员很难深入了解web接口测试的原…

自然语言生成:解决低频Tokens退化整个Tokens模型问题

Rare Tokens Degenerate All Tokens:Improving Neural Text Generation via Adaptive Gradient Gating for Rare Token Embeddings 摘要 最近的研究发现&#xff0c;大规模神经语言模型学到的Token embeddings&#xff08;令牌嵌入&#xff09;具有退化的各向异性和狭锥形状。…

MobileNet

MobileNet 文章目录 MobileNet单词重要不重要 摘要MobileNetV1Motivation深度可分离卷积逐通道卷积&#xff08;Depthwise Convolution&#xff09;逐点卷积&#xff08;Pointwise Convolution&#xff09;参数对比计算量对比 V2Inverted ResidualsLinear BottlnecksModel Arch…

使用docker进行upload-labs靶场的安装搭建

由于我是在kali上搭建&#xff0c;默认没有docker服务&#xff0c;这里就从按照docker开始讲解 一、docker按装 1、Linux内核版本查看 #如果你是kali可直接从第四步开始 #安装docker要求内核版本kerner>3.10 #为此&#xff0c;先检查当前Linux系统的内核版本 uname -a2…

分析Spring Boot项目启动慢原因之 《一》打印bean耗时

分析Spring Boot项目启动原因之 一 打印bean耗时 由于项目比较久远&#xff0c;积累的代码犹如屎山&#xff0c;然后项目启动也特别慢&#xff0c;然后产生想要优化一下启动速度&#xff0c;故写了一个Bean启动时的耗时分析&#xff1a;package com.tekrally.assetManagement.u…

【Linux】Haproxy搭建Web群集

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Haproxy搭建Web群集 一、Haproxy概述1.常见的Web集群调度器2.Haproxy应用分析3.Haproxy常用调度算法4.Haproxy的主要特性5.LVS、Nginx、Haproxy的区别 二、Haproxy搭建Web群集…

【算法题解】49. 二叉树的序列化与反序列化

这是一道 困难 题 https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/ 文章目录 题目深度优先搜索&#xff08;前序遍历&#xff09;Java 代码实现Go 代码实现复杂度分析 广度优先搜索&#xff08;层序遍历&#xff09;Java 代码实现Go 代码实现复杂度分析 …

容器的本质是什么

广义上来说&#xff0c;容器技术是动态的容器、静态的镜像和远端的仓库这三者的组合。 容器&#xff0c;就是一个特殊的隔离环境&#xff0c;它能够让进程只看到这个环境里的有限信息&#xff0c;不能对外界环境施加影响。 对于 Linux 操作系统来说&#xff0c;一个不受任何限…

【区块链】常见共识机制汇总

文章目录 公有链PoW - Proof of WorkPoS - Proof of StakeDPoS - Delegate Proof of StakePoA - Proof of Activity - 行动证明PoB - Proof of Burn 联盟链PaxosMulti-PaxosPBFTDDBFTIDBFTHotstuffZyzzyvaPoETCasperOurobrosPoSVMG-DPoSRPCAAlgorandTendermint 私有链 公有链 P…

用python实现扫雷游戏

前言 本人最近在学习python语言&#xff0c;发现python是一门很有意思的语音。python有大量的库&#xff0c;大量的函数&#xff0c;可以实现非常多的功能。尤其是在可视化方面&#xff0c;可以画图&#xff0c;可以弹出窗口。于是我就想着看能不能用python编写一个扫雷游戏。…

5. 创建声卡

代码位置 sound/soc/generic/simple-card.c static int asoc_simple_card_probe(struct platform_device *pdev) {...ret devm_snd_soc_register_card(dev, card);... } asoc_simple_card_probe -> devm_snd_soc_register_card -> snd_soc_register_card int snd_soc_r…

MS1825 SDK 移植指南

1. 概述 MS1825 SDK 支持以下 Macrosilicon 芯片&#xff0c;按照芯片功能组合的不同&#xff0c; SDK 中相关 API 和类型的定义有所 不同&#xff0c;请在该文档 API 和类型说明时特别关注&#xff1a; MS1825 SDK 的作用是帮助用户建立基于 MS1825 的视频输入输…

力扣 17. 电话号码的字母组合

题目来源&#xff1a;https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/ C题解&#xff1a; 递归法。 确定回溯函数参数&#xff1a;首先需要一个字符串s来收集叶子节点的结果&#xff0c;一个字符串数组result保存起来&#xff0c;定义为全局…

78-基于stm32单片机电压电流检测LCD1602显示(程序+原理图+元件清单全套资料)...

资料编号&#xff1a;078 功能介绍&#xff1a;采用stm32单片机作为主控CPU&#xff0c;采用精密电阻分压将高电压分压后接入STM32单片机ADC接口&#xff0c;采用ADC可以采集出当前的电压值&#xff0c;通过功率电阻来测量电路中的电流&#xff0c;通过串联电路电流相同的原理&…

正则表达式 教程与简介 | 一看就懂!!!(一)

目录 一、正则表达式 - 教程 二、 正则表达式的模式 &#xff08;一&#xff09;字面值字符 &#xff08;二&#xff09;特殊字符 &#xff08;三&#xff09;字符类 &#xff08;四&#xff09;元字符 &#xff08;五&#xff09;量词 &#xff08;六&#xff09;边界…

如何进行小红书笔记关键词布局,热词分析!

坐拥2.6亿活跃用户&#xff0c;小红书已经成为品牌宣推、种草的重要平台之一。那么品牌进入平台&#xff0c;如何进行小红书笔记关键词布局&#xff0c;热词分析&#xff01; 一、 如何确定关键词 想要做好小红书关键词布局&#xff0c;首先要明确如何确定关键词。 1、当我们要…

shell判断程序是否运行,守护进程

一、需求 服务部署在linux上&#xff0c;要求服务器上的服务可以一直保持正常运行 二、问题 在linux上部署的微服务&#xff0c;不知道什么原因过一段时间就自己停掉了&#xff0c;无法启动。 三、解决办法 添加angle守护进程&#xff0c;通过定时执行脚本来判断程序是否运行…