网络会话管理

一 什么是会话

1 生活中会话

A:商量个事儿呗

B:嘛事

A:借点钱呗

B: 喂…喂…我这里信号不好…

2 Web中会话

打开浏览器-》访问应用-》关闭浏览器

用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,有时服务器要想办法为每个用户保存这些数据。

例如:在浏览器中保存用户的token

但是HTTP(超文本传输协议)是一个基于请求与响应模式的无状态协议。当同一个浏览器多次发送请求到服务器时,服务器并不知道是哪个浏览器发送的请求,即 HTTP 协议的请求无法保存用户状态。

Http无状态主要指 :
针对Http协议,服务器不能自动维护用户的上下文信息,无法保存用户状态;
每次请求都是独立的,不会受到前面请求的影响,也不会影响后面的请求。

由于 HTTP 协议是无状态的,无法保存和跟踪用户状态,所以需要其他的方案来解决问此题,它就是会话技术。常用的会话技术分为两种:

Cookie :浏览端会话技术
Session :服务端会话技术

3 会话技术

1)Cookie:将数据保存在浏览器客户端的技术

服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了

2)Session:将数据保存在服务端的技术

服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务

二 Cookie

1 原理

在这里插入图片描述

1)服务端创建cookie对象

2)发送cookie信息到浏览器(HttpServletResponse 中提供void addCookie(Cookie cookie)方法)

例如,响应头中增加 Set-Cookie: name=zhangsan

3)浏览器将得到的cookie信息保存在浏览器端

4)通过浏览器下次访问web应用时,请求数据中会带上cookie信息例如,请求头中 Cookie: name=zhangsan

5)服务器端收到浏览器发送的cookie信息

2 使用

Cookie类中常用方法:

方法
Cookie(String name, String value)创建cookie对象的构造方法,value是字符串类型,tomcat8后value可以使用中文
String getName()取得Cookie的名字
String getValue()取得Cookie的值
void setValue(String newValue)设置Cookie的值
void setMaxAge(int expiry)设置Cookie的最大保存时间,单位秒,即cookie的有效期,默认会话结束,cookie失效。值为 0 时,表示删除该 Cookie
int getMaxAge()获取Cookies的有效期
void setPath(String uri)设置cookie的有效路径,比如把cookie的有效路径设置为"/aaa",那么浏览器访问"aaa"的web资源时,就会带上cookie
String getPath()获取cookie的有效路径
2.1 添加cookie
public void cookie1(HttpServletRequest request, HttpServletResponse response){//创建cookie对象Cookie cookie = new Cookie("name", "zhangsan");//如果有相同name值得cookie,后一个会替换前一个cookie内容//Cookie cookie1 = new Cookie("name", "lisi");//cookie中的name和value都是字符串类型//Cookie cookie1 = new Cookie("age", "10");//tomcat8之后,cookie中支持中文//Cookie cookie1 = new Cookie("name", "张三");//通过响应将cookie数据发送到浏览器端response.addCookie(cookie);//response.addCookie(cookie1);}

注意:在tomcat 8 之后,cookie支持中文数据,但是某些特殊字符还是不支持,比如空格、分号等,需要借助URLEncoder.encode(字符串, “utf-8”)进行编码。
这种特殊字符也不用刻意去记,出问题后,直接进行编码

2.2 遍历cookie
public void cookie1(HttpServletRequest request, HttpServletResponse response){//获取请求中的cookie数据Cookie[] cookies = request.getCookies();if(cookies != null){for (Cookie cookie2 : cookies) {// 获取cookie的name和对应的valueSystem.out.println(cookie2.getName());System.out.println(cookie2.getValue());}}
}
2.3 设置cookie的过期时间
public void cookieTime(HttpServletRequest request, HttpServletResponse response){Cookie cookie = new Cookie("name", "zhangsan");//设置cookie的过期时间//单位秒//		cookie.setMaxAge(60 * 60);//可以实现删除已有的cookie//		cookie.setMaxAge(0);//过期时间:会话结束时cookie.setMaxAge(-1);response.addCookie(cookie);}

3 特点

一个cookie不能超过4k;

一个浏览器最多存300个cookie;

一个站点最多存20个cookie

三 Session

在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),可用用于保存客户端用户的访问状态。

注意:
一个浏览器独占一个session对象
同一浏览器的不同窗口共享同一 Session 对象,但不同浏览器窗口之间不能共享 Session 对象。
Session依赖于cookie
不同的Servlet可以共享同一Session对象中的数据

1 原理

在这里插入图片描述

1)访问应用时,如果创建session(request.getSession()),每个session对象会分配一个id,称谓JSESSIONID

2)服务器会将session的id以cookie的形式发送给浏览器端,浏览器端会存储该id

3)以后再访问应用时,浏览器将session的id发送给服务端

4)服务端收到session的id后,会根据id查找对应的session对象,如果没有找到,创建一个新的session对象

2 使用

HttpSession中常用方法:

方法
String getId( )获取当前的会话ID。每个会话在服务器端都存在一个唯一的标示sessionID,session对象发送到浏览器的唯一数据就是sessionID,它一般存储在cookie中。
void setMaxInactiveInterval(int interval)指定在无任何操作的情况下,设置会话的最大持续时间,单位是秒,默认30分钟,负数表明会话永不失效
int getMaxInActiveInterval()获取会话的最大持续时间
void setAttribute(String name,String value)设定指定名字的属性的值,并将它添加到session会话范围内
Object getAttribute(String name)在会话范围内获取指定名字的属性的值,返回值类型为object,如果该属性不存在,则返回null
void removeAttribute(String name)删除指定名字的session属性
void invalidate()使session失效。可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问
long getLastAccessedTime()返回上一次发送与此 Session 关联的请求的时间
2.1 创建session对象
//会根据session的id 查找服务端是否有对应的session对象,如果有,返回session对象;如果没有创建session对象
//创建session对象后,会将JSESSIONID以cookie的形式存在浏览器端
HttpSession session = request.getSession();//根据JSESSIONID找session对象,如果存在,返回;如果不存在,返回null
// HttpSession session = request.getSession(false);//session的id,唯一的   JSESSIONID
String id = session.getId();
System.out.println(id);//默认情况下,JSESSIONID的过期时间是会话结束时,为了能正常访问session对象,需要手动将JSESSIONID存储到cookie中,并设置一个合适的过期时间
Cookie cookie = new Cookie("JSESSIONID", id);
cookie.setMaxAge(30 * 60);
response.addCookie(cookie);//设置session的过期时间,单位秒,默认30分钟
session.setMaxInactiveInterval(10 * 60);//向session域中存入数据
session.setAttribute("name", "张三");
2.2 不同的servlet间共享session对象中数据
// 在一个servlet中存储数据
session.setAttribute("name", "zhangsan");// 在另一个servlet中读取数据
System.out.println(session.getAttribute("name"));
2.3 web.xml中设置session的超时时间

单位分钟

<session-config><session-timeout>10</session-timeout>
</session-config>

3 禁用cookie的处理 了解

session依赖cookie,因为服务器需要根据sessionId,然后找到客户端的session对象,如果浏览器禁用了cookie,就需要对URL进行重写,这样服务器收到的请求中就会带有sessionId。

使用方法:response.encodeURL(String url)

它会判断客户端浏览器是否禁用了Cookie,如果禁用了,那么这个方法会在URL后面追加jsessionid,否则不会追加。

// /day36_session/main;jsessionid=8BE9D12D48CB4C51532A9C007698EEFF
String encodeURL = response.encodeURL(request.getContextPath() + "/main");
response.sendRedirect(encodeURL);

4 Cookie与Session的不同

CookieSession
Cookie 将数据存放在浏览器端Session 将数据存储在服务器端
浏览器对 Cookie 的大小和数量有限制Session 的大小和数量一般不受限制
Cookie 中保存的是字符串Session 中可以保存任意类型的对象
Cookie 明文传递,安全性低Session 存在服务器端,安全性较高
Cookie 保存在客户端,不占用服务器资源Session 保存在服务端,若并发访问的用户十分多,就会占用大量服务端资源

5 request/session/ServletContext

request、session 和ServletContext 称为 Servlet 的三大域对象,它们都能实现资源间共享数据

requestsessionServletContext
只对当前请求涉及的 Servlet 有效,通过请求的转发可以实现一次请求中资源之间共享数据。session 对本次会话期间的所有 Servlet 都有效,session对象过期,手动调用方法销毁,会话结束对整个 Web 应用内的所有 Servlet 有效

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

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

相关文章

Keil软件某些汉字输出乱码,0xFD问题,51单片机

1. 问题 keil软件输入某些汉字的时候会输出乱码&#xff0c;例如&#xff1a;升、 数 2. 原因 keil软件会忽略0xFD。 升的GB2312编码为 0xc9fd&#xff0c;keil解析为0xc9数的GB2312编码为 0xcafd&#xff0c;keil解析为0xca 关于Keil软件中0xFD问题的说明 3. 解决方案1 …

E5071C 是德科技网络分析仪

181/2461/8938产品概述&#xff1a; E5071C ENA 矢量网络分析仪&#xff0c;9 kHz 至 20 GHz&#xff0c;配有增强型 TDR 测量选件。 E5071C 是大规模无源元器件测试的理想解决方案。 它具有出色的测量性能&#xff0c;有助于提高测试吞吐量&#xff0c;尤其是与 E5092A 多端…

力扣题目训练(3)

2024年1月27日力扣题目训练 2024年1月27日力扣题目训练290. 单词规律292. Nim 游戏303. 区域和检索 - 数组不可变91. 解码方法92. 反转链表 II41. 缺失的第一个正数 2024年1月27日力扣题目训练 2024年1月27日第三天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;包…

SQL注入:盲注

SQL注入系列文章&#xff1a; 初识SQL注入-CSDN博客 SQL注入&#xff1a;联合查询的三个绕过技巧-CSDN博客 SQL注入&#xff1a;报错注入-CSDN博客 目录 什么是盲注&#xff1f; 布尔盲注 手工注入 使用python脚本 使用sqlmap 时间盲注 手工注入 使用python脚本 使…

聊聊鸿蒙HarmonyOS NEXT 的技术细节

上周&#xff0c;华为在深圳举办了“鸿蒙生态千帆启航仪式”&#xff0c;这也是华为鸿蒙开启生态进阶的信号。在政策的叠加下&#xff0c;鸿蒙未来必定是势不可挡的。我们这些程序员也得与时俱进&#xff0c;熟悉鸿蒙的技术和细节&#xff0c;别在经济寒冬里被淘汰了。 官方称…

scrapy框架核心知识Spider,Middleware,Item Pipeline,scrapy项目创建与启动,Scrapy-redis与分布式

scrapy项目创建与启动 创建项目 在你的工作目录下直接使用命令: scrapy startproject scrapytutorial运行后创建了一个名为scrapytutorial的爬虫工程 创建spider 在爬虫工程文件内&#xff0c;运行以下命令&#xff1a; scrapy genspider quotes创建了名为quotes的爬虫 …

【分治专题】详解快排类型4道题

本文讲解分治下的快排类型的4道题&#xff0c;在讲解题目的同时提供AC代码&#xff0c;点击题目即可打开对应链接 目录 1、颜色分类 2、排序数组 3、数组中的第K个最大元素 4、库存管理 III 1、颜色分类 解法&#xff08;快排思想--三指针法使数组分三块&#xff09;&…

专业建设数字平台

专业建设数字平台&#xff0c;遵循以学生发展为中心、以产出为导向的OBE理念&#xff0c;大数据赋能人才培养全过程管理&#xff0c;支撑专业数字化建设与专业认证等专项工作&#xff0c;平台围绕学院与专业建设中人才培养方案制定的顶层设计工作及全流程、全场景业务&#xff…

ARM常用汇编指令

文章目录 前言一、处理器内部数据传输指令MOV&#xff1a; 将数据从一个寄存器复制到另一个寄存器。MRS&#xff1a; 将特殊寄存器(CPSR,SPSR)中的数据传给通用寄存器。MSR&#xff1a; 将通用寄存器中的数据传给特殊寄存器(CPSR,SPSR)。 二、存储器访问指令LDR:用于从内存中加…

力扣面试题 16.06. 最小差

Problem: 面试题 16.06. 最小差 文章目录 题目描述思路即解法复杂度Code 题目描述 思路即解法 注意本题目的数据范围!!! 1.对数组a与数组b进行排序;获取a与b的数组长度aLen,bLen&#xff0c;定义一个long类型的变量min&#xff1b; 2.分别让两个指针i&#xff0c;j指向数组的开…

56. 合并区间 - 力扣(LeetCode)

题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 题目示例 输入&#xff1a;intervals [[1,3…

LeNet跟LeNet5详解

1 LeNet结构 主要是为了手写数字识别 具体结构讲解&#xff1a;从图中例子可得 1 先传入一个灰度图像尺寸为1x28x28&#xff0c;通道数为1&#xff0c;尺寸为28x28的灰度图像 2 第一层5x5卷积&#xff0c;经过公式 输入图像尺寸-卷积核尺寸2padding/步长1&#xff0c;&#…

༺༽༾ཊ—设计-抽象-05-工厂-模式—ཏ༿༼༻

名称&#xff1a;抽象工厂 类型&#xff1a;创建型 目的&#xff1a;当有多个抽象角色时使用的一种工厂模式。 抽象工厂模式可以向客户端提供一个接口&#xff0c;使 客户端在不必指定产品的具体情况下&#xff0c;创建多个产品族中的产品对象。 优点&#xf…

Linux第38步_编译“正点原子移植好的uboot”

uboot的全称是Universal Boot Loader&#xff0c;uboot是一个遵循GPL协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB等高级功能。 uboot官方的uboot源码是给所有的半导体厂商准备的。ST公司会…

v38.恒星金字塔

1.循环嵌套 1.1矩阵&#xff08;i&#xff0c;j&#xff09; i行 j列 将矩阵与循环嵌套结合起来: 2.2.于是&#xff0c;金字塔就是

基于QC-LDPC编码的循环移位网络的FPGA实现

一、桶式移位寄存器(barrel shifter) 八位桶式移位寄存器的VHDL实现如下&#xff0c;由于每一层结构相似&#xff0c;于是采用生成语句for_generate实现&#xff0c;使用该代码实现的RTL级分析和理论的结构一致&#xff0c;仿真结果也符合预期。 entity barrel_shift isGENE…

从关键新闻和最新技术看AI行业发展(2024.1.15-1.28第十五期) |【WeThinkIn老实人报】

Rocky Ding 公众号&#xff1a;WeThinkIn 写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&…

GEE数据集——MOD13A1.006Terra星搭载的中分辨率成像光谱仪获取的L3级植被指数产品

数据名称&#xff1a; MOD13A1.006 Modis 16天 Terra 500m 数据来源&#xff1a; NASA 时空范围&#xff1a; 2000-2022年 空间范围&#xff1a; 全国 波段 名称波段单位最小值最大值比例因子波长描述NDVIB1NDVI-2000100000.0001Normalized Difference Vegetation…

for循环里i++和++i的区别

主要有以下三个区别&#xff1a; 1、i是先改变i的值即加1后再使用i的值&#xff1b;而i是先使用i的值在改变它的值即加。 2、for循环内部仅形式不同&#xff1a;当i循环和i循环在for循环内部&#xff0c;虽然形式上明显不同&#xff0c;但输出结果可以一样。 public static …

“群载波”全频强插无线应急广播在高速公路交通管控中的应用

一、“群载波”全频强插应急广播系统基本概念 群载波应急广播系统的技术是北京恒星科通科技发展有限公司技术总监刘军先生多年从事无线通信与应急通信产品的研发&#xff0c;突破传统无线电理论&#xff0c;开创性地提出了“群载波”通信理论&#xff0c;并亲自投入很大精力潜心…