会话跟踪技术(Session 以及Cookie)

一: 前提概要

        1>会话:

        会话指的是用户打开浏览器, 访问某些web服务器资源的时候, 会话就会进行建立, 直到有一方断开, 那么会话才会结束, 需要注意的一点是, 一次的会话可以有多次的请求以及响应

        2>会话跟踪:

        是一种用于维护浏览器状态的方法, 服务器需要识别多次的请求, 分别来自于那些会话, 以便在一次的会话当中的多次请求已经响应当中, 实现 "数据共享"

        3>服务器为什么不能够识别这些请求来自哪个浏览器?

        因为服务器跟浏览器之间使用的是HTTP协议, HTTP协议是无状态的, 每次浏览器向服务器进行请求的时候, 服务器都会将其视作新的请求, 所以我们需要会话跟踪技术实现会话之间的数据共享

        4>实现方式:

        1.客户端会话跟踪技术:  Cookie

        客户端会话跟踪技术, 实际上就是将一些共享的数据存储在客户端

        2.服务端会话跟踪技术:  Session

        服务端会话跟踪技术, 实际上就是将共享的数据存储在服务端

                两者实现的功能其实都是一样的,都是为了解决一次会话中, 多次请求的问题

二: 实现方式--Cookie

        1>基本使用:

                1.发送Cookie:

 // 发送cookie
//创建cookie  进行发送cookie//1.创建cookie对象Cookie cookie = new Cookie("username", "zs");resp.addCookie(cookie);

                2.获取Cookie:


//        获取响应的cookie//在这里, 我们通过req获得的cookie包括了其中所有的cookie, 所以需要通过数组进行相应的接收Cookie[] cookies = req.getCookies();
//        之后通过循环 以及一些判断的方式来获响应的数据, 键值对for (Cookie cookie : cookies) {String name = cookie.getName();//            进行判断, 我们仅仅只需要我们所输入的键值对即可if ("username".equals(name)){String value = cookie.getValue();System.out.println(name+" "+value);break;}

        2>Cookic原理:

        需要知道的一点是: COOKIE的实现都是基于HTTP协议的!

举例:

        在浏览器发送请求之后, 服务端识别出来是cookie, 这个时候服务端会将相应的共享数据存储在响应头(set-cookie)当中, 之后, 将其相应到浏览器当中, 并且将相应的数据存储在浏览器内存中

        之后, 浏览器在同一个会话当中再次发送请求, 并且将刚才存储的共享数据放在请求头 (cookie)当中, 以请求的方式放入服务端, 从而实现数据的共享

        3>Cookie的使用细节:

        1.存活时间:

                默认的情况下, Cookie会存储在浏览器当中 , 浏览器关闭的时候相应的Cookie会自动的进行销毁

        2.手动设置Cookie的存活时间:

        

        通过这种方式, 可以实现某些记住账号, 密码的任务

Cookie cookie = new Cookie("username", "zs");//        设置存活时间:  一周cookie.setMaxAge(60*60*24*7);resp.addCookie(cookie);

        3.Cookie存储中文:

        实际上Cookie不能够直接存储相应的中文信息, 比如在这里, 我将相应的值设置为  '张三'

  Cookie cookie = new Cookie("username", "zs");

        进行访问就会出现以下的错误:

        *解决方式:URL编码*

        通过使用URL编码 URL解码  的方式进行转码:

String value="张三";//URL编码:value = URLEncoder.encode(value,"UTF-8");System.out.println(value);Cookie cookie = new Cookie("username", value);System.out.println("username"+" "+value);
if ("username".equals(name)){String value = cookie.getValue();//url解码value = URLDecoder.decode(value, "UTF-8");
//                进行打印System.out.println(name+" "+value);break;}

        问题得到解决 

三: 实现方法 -- Session:

        1>基本使用:

        1.发送Session:

  // 存储到Session当中
//        1.获取Session对象HttpSession session = req.getSession();//2.存储数据session.setAttribute("username","zs");

        2.获取Session:

  //获取数据//1获取Session对象:HttpSession session = req.getSession();Object username = session.getAttribute("username");System.out.println(username);

        2>Session原理:

        结论 :  Session是基于Cookie来进行实现的

示例:

        服务器在接收到相应的请求之后, 发现使用的是Session的方式, 之后就会解析Session的ID, 将其进行记录, 之后再将其通过Cookie的方式, 使用请求头(set-cookie)并且在其中保存ID的值, 传给客户端, 之后客户端将相应的值保存在浏览器当中, 之后再进行响应, 将刚才的数据以响应头(cookie)并且附带之前的地址值传给服务端

        3>Session的使用细节:

        1.Session的钝化, 活化:

        在服务器进行重启之后, Session之前进行提交的数据是否还会存在?(这里指的是正常的关闭, 在IDEA的控制面板当中, 如果直接停止程序是非正常关闭系统)

        ①钝化:

        指的是在服务器进行正常的关闭之后, Tomcat会自动的将Tomcat当中的数据存在硬盘当中

        ②活化:

        再次进行启动服务器之后, 从文件当中加载数据到Session当中, 即在正常关闭之后, 之前的Session是不会被立刻的销毁的, 再次进行启用的时候就会继续加上上一次的数据到Session当中

        TIPS:需要注意的一点是, 如果不关闭服务器, 而是在启动服务器之后在浏览器进行访问, 关闭网页, 再次进行访问, 这个时候对应的Session并不是同一个的Session地址值会发生改变, 不再是同一个地址值

        2.Session的销毁:

        

        第二种自我销毁的方式, 常常会被用于在退出登录的时候, 销毁相应的Session对象

        

 

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

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

相关文章

CTF题型 php://filter特殊编码绕过小汇总

CTF题型 php://filter特殊编码绕过小汇总 文章目录 CTF题型 php://filter特殊编码绕过小汇总特殊编码base64编码string过滤器iconv字符集 例题1.[Newstarctf 2023 week2 include]2.[Ctfshow web 117] php://filter 是一个伪协议,它允许你读取经过过滤器处理的数据流…

Jmeter 从登录接口提取cookie 并 跨线程组调用cookie (超详细)

文章目录 一、开始前的准备二、 业务场景介绍三、从登录接口提取cookies四、跨线程组调用cookies 一、开始前的准备 1、安装Jmeter,参考文章:JMeter 3.1 和JMeterPlugin的下载安装 2、设置配置文件使Cookie管理器保存cookie信息。 修改apache-jmeter-x…

C语言:编译和链接

前言 在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)。第2种是执行环境,它用于实际执行代码。 目录 1.翻译环境1.1 预处理(预编…

iOS - Runtime - Class-方法缓存(cache_t)

文章目录 iOS - Runtime - Class-方法缓存(cache_t)1. 散列表的存取值 iOS - Runtime - Class-方法缓存(cache_t) Class内部结构中有个方法缓存(cache_t),用散列表(哈希表)来缓存曾经调用过的方法,可以提高…

vlan间单臂路由

【项目实践4】 --vlan间单臂路由 一、实验背景 实验的目的是在一个有限的网络环境中实现VLAN间的通信。网络环境包括两个交换机和一个路由器,交换机之间通过Trunk链路相连,路由器则连接到这两个交换机的Trunk端口上。 二、案例分析 在网络工程中&#…

Qt 完成图片的缩放拖动

1. 事件和函数 主要使用事件paintEvent(QPaintEvent *event)和drawTiledPixmap函数实现绘图。 paintEvent事件在改变窗口大小、移动窗口、手动调用update等情形下会被调用。需先了解下绘图该函数的用法。 - QPainter::drawTiledPixmap(int x, int y, int w, int h, const QPi…

数据运营分析-详解

一、指标与指标体系 指标体系就是业务逻辑的框架,也是思考业务逻辑的第一步 案例: 老板,我负责的用户活跃,主要考察每天启动产品的注册用户数量,整体来看,每月活跃保持7.3%的增长,是因为渠道团队的拉新活动带来很多新增注册用户,占每月活跃用户的40%,新一年会继续沿…

计算机网络⑦ —— 网络层协议

1. ARP协议 在传输⼀个 IP 数据报的时候,确定了源 IP 地址和⽬标 IP 地址后,就会通过主机路由表确定 IP 数据包下⼀跳。然⽽,⽹络层的下⼀层是数据链路层,所以我们还要知道下⼀跳的 MAC 地址。由于主机的路由表中可以找到下⼀跳的…

Python-基础部署

机器没法直接读懂我们写的代码,需要解释解释器作为中间的翻译,把代码转换成字节码在执行 安装python解释器 Download Python | Python.org 安装代码编辑器 pycharm Thank you for downloading PyCharm! 创建一个项目,每个项目里的文件夹…

Android Studio Iguana | 2023.2.1 补丁 1

Android Studio Iguana | 2023.2.1 Canary 3 已修复的问题Android Gradle 插件 问题 295205663 将 AGP 从 8.0.2 更新到 8.1.0 后,任务“:app:mergeReleaseClasses”执行失败 问题 298008231 [Gradle 8.4][升级] 由于使用 kotlin gradle 插件中已废弃的功能&#…

9、jenkins微服务持续集成(一)

文章目录 一、流程说明二、源码概述三、本地部署3.1 SpringCloud微服务部署本地运行微服务本地部署微服务3.2 静态Web前端部署四、Docker快速入门一、流程说明 Jenkins+Docker+SpringCloud持续集成流程说明 大致流程说明: 开发人员每天把代码提交到Gitlab代码仓库Jenkins从G…

Linux---命令行参数

一、命令行参数 在介绍命令行参数前,我想问大家一个问题,在以前写C/C时,main 函数可不可以带参数? 答案是可以带的,int main(int argc, char* argv[]){},但平时写代码时也证明了,main 函数的参…

【实验报告】--基础VLAN

【VLAN实验报告】 一、项目背景 (为 Jan16 公司创建部门 VLAN) Jan16 公司现有财务部、技术部和业务部,出于数据安全的考虑,各部门的计算机需进 行隔离,仅允许部门内部相互通信。公司拓扑如图 1 所示, …

leetcode:392. 判断子序列

题目: class Solution { public:bool isSubsequence(string s, string t) {} }; 题解: 很巧妙的题解:循环遍历两个字符串,两个字符串都没遍完就继续遍历,字符串s先遍历完结果为true,字符串t先遍历完结果为…

【JavaSE】java刷题--数组练习

前言 本篇讲解了一些数组相关题目(主要以代码的形式呈现),主要目的在于巩固数组相关知识。 上一篇 数组 讲解了一维数组和二维数组的基础知识~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎…

MySQL之MVCC如何实现可重复读和提交读

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ 👀👀👀 个人博客:小奥的博客 👍👍👍:个人CSDN ⭐️⭐️⭐️:Github传送门 🍹 本人24应届生一枚,技术和水平有…

gitee多用户配置

一、引言 在工作的时候我们有时候会自己创建项目Demo来实现一些功能,但是又不想把自己的Demo代码放到公司的仓库代码平台(gitee)中管理,于是就是想自己放到自己的Gitee中管理,于是就需要配置Git多用户。 本文将配置分别…

Clip Converter - 视频在线下载方法

Clip Converter - 视频在线下载方法 1. Video URL to Download2. Continue3. StartReferences YT to MP4 & MP3 Converter! https://www.clipconverter.cc/ Clip Converter is a free online media conversion application, which allows you to reocord, convert and do…

2024软件设计师备考讲义——UML(统一建模语言)

UML的概念 用例图的概念 包含 <<include>>扩展<<exted>>泛化 用例图&#xff08;也可称用例建模&#xff09;描述的是外部执行者&#xff08;Actor&#xff09;所理解的系统功能。用例图用于需求分析阶段&#xff0c;它的建立是系统开发者和用户反复…

虚幻引擎资源加密方案解析

前段时间&#xff0c;全球游戏开发者大会(Game Developers Conference&#xff0c;简称GDC)在旧金山圆满落幕&#xff0c;会议提供了多份值得参考的数据报告。根据 GDC 调研数据&#xff0c;当下游戏市场中&#xff0c;Unreal Engine (下文简称虚幻)和 Unity 是使用最多的游戏引…