会话跟踪技术基础:Cookie和Session

久违了,之前忙碌了一周赶毕设,今天抽空更新~ 

一.理论知识

1.会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应~

2.会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求之间共享数据~ 

        需要注意的是,HTTP请求协议是无状态的(为了保证每次请求的速度不慢),每次浏览器向服务器发送请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据的共享~

二.Cookie客户端会话跟总监技术

1.使用

如上图,Cookie是客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。


 在某个Servlet中,首先创建Cookie对象:

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

然后调用Response对象发送Cookie对象,再添加一些提示符:

resp.addCookie(cookie);
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("使用成功~");

运行Tomcat并访问Servlet:

Chrome浏览器中查看数据:

 Cookie已经被保存。

再新建另一个Servlet:

获取Cookie数组:

Cookie[] cookies = req.getCookies();

写下面一段循环:目的是获取上面咱们自定义的Cookie数据:

for(Cookie cookie:cookies){
            String name=cookie.getName();
            if("username".equals(name))
            {
                String value = cookie.getValue();
                resp.setContentType("text/html;charset=utf-8");
                resp.getWriter().write(name+":"+value);
            }
        }

重新启动Tomcat并访问AServlet:

再访问BServlet:获取成功!

以上即为一次会话两次请求之间共享数据的经典案例~ 

2.原理

        Cookie的实现是基于Http协议的。 在发送数据的时候使用set-Cookie响应头将数据发送到浏览器的内存中,而获取数据的时候使用cookie请求头来获取到cookie的数据。

3.生命周期

默认情况下,Cookie由于存储在浏览器内存中,当浏览器关闭时内存释放,Cookie即会被销毁~

setMaxAge(int seconds):设置Cookie存活时间:

  • 正数:将Cookie写入浏览器所存在电脑的硬盘,持久化存储,到时间即自动删除
  • 负数:默认值,浏览器关闭则会将Cookie销毁
  • 零:删除Cookie

4.设置中文

Cookie不能直接存储中文,需要进行URL转码。


创建对象时先编码:

        String name="拜仁慕尼黑~";
        URLEncoder.encode(name);
        Cookie cookie=new Cookie("name",name);
        resp.addCookie(cookie);
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().write("使用成功~");

获取时再解码:

Cookie[] cookies = req.getCookies();

        for(Cookie cookie:cookies){
            String name=cookie.getName();
            if("name".equals(name))
            {
                String value = cookie.getValue();
                value= URLDecoder.decode(value);
                resp.setContentType("text/html;charset=utf-8");
                resp.getWriter().write(name+":"+value);
            }
        }

如下,中文汉字的数据亦可成功存储到cookie之中~

三.Session服务器会话跟总监技术

1.使用

        Session即服务端会话跟踪技术:将数据保存到服务端~JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能~ 


获取Session对象并传入值:

HttpSession session = req.getSession();
session.setAttribute("name","jsl");

在另一个Servlet中获取Session对象的数据:

        HttpSession session=req.getSession();
        Object name=session.getAttribute("name");
        System.out.println(name);

分别访问C和D两个Servlet后控制台成功输出:

2.原理 

 Session基于Cookie实现:

如上,在一次会话中,多次请求之间的Cookie是同一个值~ 

        本质还是将Session的唯一标识id作为Cookie值在多次请求之间共享:通过响应头获取id,再将id通过请求头传输给别的请求~

3.钝化、活化

服务器重启后,Session中的数据还存在~

  • 钝化:在服务器正常关闭之后,Tomcat会自动将Session数据写入硬盘的文件中~
  • 活化:再次启动服务器后,从文件中加载数据到Session中~

Session数据想共享,浏览器一定不能关闭~

4.销毁

  • 默认情况下无操作30分钟后会自动销毁~
  • 也可以使用invalidate()方法将自己销毁~

四.对比

服务器很难被攻破~) 

  • 购物车一般使用Cookie(长期存储~)
  • 偏好设置一般用Cookie(长期存储~)
  • 用户名展示一般用Session(安全保护~)
  • 需要一提的是,保存密码30天之类的功能,是一种不太安全的操作~
  • 验证码不能“不打自招”,必须使用Session~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp的h5项目 用命令起这个项目(vue-cli)

这里其实就相当于给uniapp h5套了一个vue-cli的壳(纯属个人感觉) 首先需要安装vue-cli 脚手架 npm install -g vue/cli然后创建项目(这里需要在hbuilder创建) vue create -p dcloudio/uni-preset-vue uniapp安装成功后它的结构…

远程控制软件免费

远程控制软件免费:选择、价值与安全性探讨 随着科技的进步和互联网的普及,远程控制软件在日常生活和工作中的应用越来越广泛。这类软件允许用户通过网络远程访问和控制另一台计算机,为远程办公、技术支持和在线教育等提供了极大的便利。本文…

2、JVM内存模型深度解析

JVM整体结构及内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 JVM分为五大模块: 类装载器子系统 、 运行时数据区 、 执行引擎 、 本地方法接口 和 垃圾收集模块 。 方法区Java8之后的变化 移除了 Pe…

上位机图像处理和嵌入式模块部署(qmacvisual缺失的光源控制)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 有些场景下面,是不需要光源和光源控制的,比如说利用摄像头识别对应区域的库位,这部分直接利用红外光采集对应的…

FPGA - 以太网UDP通信(二)

一,引言 前文链接:FPGA - 以太网UDP通信(一) 在上文章中介绍了以太网简介,以太网UDP通信硬件结构,以及PHY芯片RGMII接口-GMII接口转换逻辑,接下来介绍UDP通信结构框图以及数据链路层&#xff…

ActiveMQ + MQTT 集群搭建(虚机版本) + Springboot使用配置

文章目录 前言一、ActiveMQ、 MQTT是什么?1.ActiveMQ介绍2.MQTT介绍 二、集群搭建步骤1.下载apache-activemq-5.15.12-bin.tar.gz2.上传apache-activemq-5.15.12-bin.tar.gz到服务器并解压文件到文件夹clusters、master、slave三个文件夹下面形成三个节点&#xff0…

【cocos creator】【TS】贝塞尔曲线,地图之间显示曲线,顺着曲线移动

参考: https://blog.csdn.net/Ctrls_/article/details/108731313 https://blog.csdn.net/qq_28299311/article/details/104009804 const { ccclass, property } cc._decorator;ccclass export default class mapPanel extends cc.Component {property(cc.Node)pla…

Oracle 常用命令总结

文章目录 一、数据库启动 & 关闭&查看1、启动数据库2、关闭数据库3、连接数据库4、查看数据库名5、查看实例 二、用户1、创建用户2、重置密码3、账户解锁4、账号赋权5、账户撤销权限6、删除用户7、查询所有用户(DBA账号执行)8、查看当前用户连接…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅰ)配置项文档

配置项API 引入思路介绍TablePage-vue3 API汇总属性插槽Exposes自定义对象searchConfig(array<object\> 类型)searchConfig-type当typetimes时当type不为时间类型时的 bind默认值&#xff08;Object类型&#xff09;当type为时间类型时的 bind默认值&#xff08;Object类…

【MySQL】数据库节点的平滑扩容方案

一、背景 众所周知&#xff0c;数据库很容易成为应用系统的瓶颈。单机数据库的资源和处理能力有限&#xff0c;在高并发的分布式系统中&#xff0c;可采用分库分表突破单机局限。本文来探讨下数据库节点的平滑扩容方案 二、节点扩容 2.1、什么是节点扩容 扩容一般是指水平分…

02 SQL基础 -- 初识SQL

一、初识 SQL 1.1 概念介绍 数据库中存储的表结构类似于 excel 中的行和列,在数据库中,行称为记录,它相当于一条结论,列称为字段,它代表了表中存储的数据项目 行和列交汇的地方称为单元格,一个单元格只能输入一条记录 SQL是为操作数据库而开发的语言。国际标准化组织(…

java数据结构与算法刷题-----LeetCode268. 丢失的数字

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 数学位运算 数学 解题思路&#xff1a;时间复杂度O( n n n)&…

EFcore 6 连接oracle19 WinForm vs2022

用EFcore访问Oracle&#xff0c;终于不需要Oracle的什么安装包了&#xff0c;直接在VS2022中就可以轻松搞定。在csdn上看到一哥们的帖子&#xff0c;测试了一下&#xff0c;发现很方便。使用的场景是&#xff1a;VS2022中EFcore6。经过测试&#xff0c;同 Navicat Premium 16比…

【数据可视化包Matplotlib】Matplotlib基本绘图方法

目录 一、Matplotlib绘图的基本流程&#xff08;一&#xff09;最简单的绘图&#xff08;仅指定y的值&#xff09;&#xff08;二&#xff09;更一般的绘图&#xff08;同时指定x和y的值&#xff09;&#xff08;三&#xff09;增加更多的绘图元素 二、布局相关的对象——Figur…

linux文件访问权限理解

目录 一&#xff0c;涉及指令: 二&#xff0c;权限的表示 三&#xff0c;权限命令使用 一&#xff0c;涉及指令: umask chmod chown/chgrp 二&#xff0c;权限的表示 rwx rwx r-x含义: 访问方式: r-可读;w-可写&#xff1b;x-可执行&#xff1b; 访问用户:u-所有者;…

02.cesium中模型和图标加载处理

展示效果&#xff0c;我们期待图标点是根据模型&#xff0c;在模型的上方展示 实现思路&#xff1a; 1.在二维地图和三维地图的加载的高度计算不同&#xff0c;需要判断 2.创建一个BillboardCollection&#xff0c;用来存放图标 3.在三维地图中调用getPointPostion方法&#xf…

314_C++_QT表格的撤销、恢复,可对多行、多item进行撤销、恢复操作

行–删除后的,撤销、恢复图示: 原图示 删除后 撤销操作 恢复操作 item修改后的撤销、恢复 原item 撤销修改 恢复修改 代码: --</

Python八股文:基础知识Part1

1. 不用中间变量交换 a 和 b 这是python非常方便的一个功能可以这样直接交换两个值 2. 可变数据类型字典在for 循环中进行修改 这道题在这里就是让我们去回答输出的内容&#xff0c;这里看似我们是在for循环中每一次加入了都在list中加入了一个字典&#xff0c;然后字典的键值…

神经网络模型底层原理与实现8-BERT

首先介绍什么是自监督学习&#xff1a; 普通的有监督学习是每个x对应有个y&#xff0c;x训练得到y&#xff0c;将y与y作比较&#xff0c;而自监督是没有对应y&#xff0c;直接把一部分样本x作为训练目标x&#xff0c;训练得x后和x对比 bert中如何创造x&#xff1a;以文字处理为…

基于SSM“口腔助手”小程序

采用技术 基于SSM“口腔助手”小程序的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 小程序前台首页 注册 保健知识 我的 医生登录成功 后台管理员 …