cookie和session的原理以及在Servlet中的应用

文章目录

  • 简介
  • cookie
    • cookie的实质及实现原理
    • cookie在Servlet的应用
  • session
    • session的实质及实现原理
    • session在Servlet中的应用
    • HttpServletRequest,Session,ServletContext

在这里插入图片描述

简介

cookie保存在客户端,session保存在服务器端。二者均用于描述会话的状态。服务器端可以创建多个cookie对象响应到客户端并保存在客户端;浏览器客户端在发送请求时自动携带对应请求路径下的所有cookie信息供服务器响应使用。服务器端也可以获取每个客户端对应的唯一的一个session对象,并取得该对象中的某些属性用来验证用户的非法操作,这里只是大概讲一下二者的地位。


cookie

cookie的实质及实现原理

  • cookie实际上是浏览器的一种相对持久化存储的机制,优化了Http通信协议的无状态特性带来的缺陷,极大地提高了用户体验感

比如,某sdn、某讯视频可以在用户第一次登陆时选择保存用户的登录信息,在某段时间内用户可以在进入该网页时直接实现自动登录的效果。极大地优化了用户的体验。这是因为有我们账户对应的cookie信息存储在本地硬盘,当我们操控客户端向对应的服务器发送请求时,会自动发送这个已经保存的cookie信息,服务器接收并且验证了这个信息才使的我们能够实现客观上“免登录”的效果。

  • cookie为我们浏览器访问硬盘文件提供了一种有效途径

浏览器为了电脑的安全性,禁止js代码访问本地磁盘的数据。而cookie机制为浏览器访问硬盘文件提供了手段,也就有了持久化存储一说。

  • cookie可以由服务器创建多个,然后响应给客户端并根据需求保存在客户端的运行内存或者硬盘空间上,在用户发送向服务器端发送请求时,客户端会自动将带有cookie的请求信息发送,服务器端识别解析这个cookie信息进行响应操作。

例如,客户端在首次登录成功时,服务器创建了两个分别包含用户名和用户密码的cookie信息,并响应存储在了客户端的内存或者硬盘空间上。如果存储在内存中,那么就可以实现客户端在一次会话的过程中多次打开网站自动登录的效果;如果存储在硬盘空间并设置了生效时间,那么客户端在这段时间内都不论是否进行同一次会话都可以实现自动登录的效果。极大地优化了用户体验。如果一个常规网站在每次打开时都提示用户进行登录,这回是多么让客户抓狂的一件事!cookie的功能原理图如下,拿用户免登录来说:
cookie在一定实现内实现免登录效果图

  • cookie机制不属于Java中特有的机制,而是http协议的一部分,不过是在Jaba中有一个cookie类与其对应;每一个cookie都是有name=value的形式组成的,且二者的类型都是字符串

只要是做web开发,不论是什么编程语言,cookie机制都是必不可少的。不论是客户端还是服务器,发送的cookie样式都是键值对形式,服务器获取到的name或者value都是字符串形式


cookie在Servlet的应用

  • 服务器端创建cookie对象
Cookie cookie = new Cookie(String name,String value);  //Cookie类只提供了这一种形式的构造方法
  • 服务器端设置cookie对象的生命周期和关联路径。
cookie.setMaxAge(int second);	//设置cookie的生命周期的参数是以秒为单位的。
								//例如,设置一个cookie的生命周期为10天,可以设置参数为60*60*24*10
cookie.setPath(String url);		/*当服务器端将cookie对象相应保存到客户端时,当客户端发送在这里设置的请求
								在这里设置的请求路径时,会自动将与该路径相关的所有cookie信息包含在请求体中发送给服务器

关于服务器端设置cookie对象的生命周期

  • cookie.setMaxAge(second > 0):cookie对象存活second秒,客户端接收cookie对象后存储在本地磁盘上
  • cookie.setMaxAge(second = 0):删除这个cookie对象
  • cookie.setMaxAge(second < 0):存储这个cookie对象到浏览器内存上,在一次会话中生效,当浏览器窗口关闭后这个cookie也就失效了
  • 服务器端响应设置生命周期和路径后的cookie对象到客户端,将cookie对象存储在客户端的内存或者硬盘空间上
response.addCookie(Cookie var);
  • 服务器端接收客户端发送过来的cookie信息
Cookie cookies[] = request.getCookies();	//返回客户端发送的该路径下的所有cookie信息

关于服务端获取客户端发送的cookie信息
      服务端通过请求对象的getCookies()获取客户端发送请求路径下对应的所有的cookie信息,返回的是一个cookie数组。如果没有获取到客户端的任何cookie信息,则返回null,并不会创建一个长度为0的cookie数组返回


session

session的实质及实现原理

  • session对象是存储在服务器端的,本质上是服务器端共享数据的一种机制。

一次会话对应一个session对象。多次会话对应多个session对象。在服务器端可以向这个session对象中添加属性,本次回话中所有的请求都会共享这个session对象

  • 在web容器中,sessioon其实是以类似map集合的形式存储的,多个客户端发送请求会对应不同的session对象,类似于map集合的key值上存储的是该session对象的sessionid,这个sessionid会以cookie的形式响应到客户端进行存储;类似于map集合的value存储的是key值对应的具体的session对象。web容器中seesion的实现原理如下图:在这里插入图片描述
  • 当用户第一次发送请求的时候,服务器端会创建一个新的session对象,并可以向该session对象中添加属性,同时为该session对象关联一个唯一的sessionid并以cookie形式返回给客户端进行存储;当用户非第一次发送请求时,会自动将包含sessionid在内的请求体发送给服务器,服务器可以根据这个cookie信息中的sessionid查找对应的session对象进行响应操作。如下图所示:
    在这里插入图片描述
    不知道大家有没有发现,当你放置一个网页很长时间没有操作时,再次进行网页上的操作,这个网页可能会提示让你重新登陆,这种webapp的自我保护机制就是通过session对象实现的。session对象可以有一个有效时长。当这个session对象在该有效时长内没有被访问的话,就会自动销毁,因此用户再次请求时,服务器找不到请求用户发送的sessionid对应的session对象,这是服务器会认为你是非法访问进入这个webapp的,为了自身的安全,服务器会让用户重新登陆检验用户的身份是否合法。
    对某webapp来说,一次会话指的是用户打开浏览器发送第一次请求开始知道用户关闭浏览器为止,当用户关闭浏览器之后,本次会话也就失效了。但是在web服务器在响应结束之后也就与客户端断开连接了,并不知道用户已经关闭了浏览器,因此用户本次会话对应的session对象可能还存在。这也是为什么网银app的客户端会显示一个安全退出的按钮,用户通过点击这个按钮可以告诉服务器我要离开了,让服务器手动销毁web容器中本次回话对应的session对象,保证用户和服务器的安全。

session在Servlet中的应用

  • 服务器端创建/获取session对象
HttpSession session = request.getSession();

关于服务器端创建/获取session对象
   服务器端通过HttpServletRequest对象的getSession对象创建/获取session对象。当用户第一次在会话中发送请求时, 给用户对应会话在服务器端并没有session对象,这是getSession()方法会为该用户创建一个session对象。当用户非第一次发送请求时,getSession方法会返回该用户对应的session对象。在这里插入图片描述

  • 服务器端操作session对象的属性
session.setAttribute(String name,Object o);	//向该会话的session对象中添加属性
Object o = session.getAttribute(String var);//获取该会话中session中的属性
session.removeAttribute(String var);	    //移除该会话对应session对象中的var属性及其value
  • 服务器端销毁session对象
session.invalidate();

HttpServletRequest,Session,ServletContext

三者都可以作为数据域共享的工具,那么有什么不同呢?

  • 首先是HttpServletRequest,又称为请求域,用于请求级别的数据共享

请求对象的生命周期很短,当一次请求结束后这次请求对象也就被销毁了,请求域中的数据也就不存在了,这种数据域的共享方式常用于不同请求转发之间

  • 其次是Session,又称为会话域,是用户级别的

一个用户的一次会话对应一个session对象,这个session对象中添加的数据在这次会话中不论哪次请求都可以被共享。不同用户的会话对应不同的session,每一个session对象是被个体客户所关联的

  • 最后是ServletContext,又称为应用域,是项目级别的

向ServletContext对象中添加的共享数据域是整个项目,所有客户端所共享的
三者域的大小关系

  • HttpServletRequest < Session < ServletContext

三者的使用原则

  • 尽量使用小的域

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

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

相关文章

【第十一届“泰迪杯”数据挖掘挑战赛】B题产品订单的数据分析与需求预测“解题思路“”以及“代码分享”

【第十一届泰迪杯B题产品订单的数据分析与需求预测产品订单的数据分析与需求预测 】第一大问代码分享&#xff08;后续更新LSTMinformer多元预测多变量模型&#xff09; PS: 代码全写有注释&#xff0c;通俗易懂&#xff0c;包看懂&#xff01;&#xff01;&#xff01;&…

RK3568平台开发系列讲解(驱动基础篇)IO 模型的分类

🚀返回专栏总目录 文章目录 一、阻塞 IO二、非阻塞 IO三、IO 多路复用四、信号驱动五、异步 IO沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将针对IO模型进行分类。 假设有这样一个场景,从磁盘中循环读取 100M 的数据并处理,磁盘读取 100M 需要花费 20 秒的…

Transformer在计算机视觉中的应用-VIT、TNT模型

上期介绍了Transformer的结构、特点和作用等方面的知识&#xff0c;回头看下来这一模型并不难&#xff0c;依旧是传统机器翻译模型中常见的seq2seq网络&#xff0c;里面加入了注意力机制&#xff0c;QKV矩阵的运算使得计算并行。 当然&#xff0c;最大的重点不是矩阵运算&…

【数据结构】树的概念

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

网络基础认识

目录 一、计算机网络背景 1.1 网络发展 1.2 "协议"由来 二、网络协议初识 2.1 协议分层 2.2 OSI七层模型 2.3 TCP/IP五层模型 三、网络协议栈 四、数据包封装与分用 五、网络传输基本流程 5.1 同局域网的两台主机通信 5.2 跨网络的两台主机通信 六、网络…

MySQL高级第六篇:数据库性能分析与优化

MySQL高级第六篇&#xff1a;数据库性能分析与优化一、数据库服务器优化步骤概述二、慢查询日志&#xff1a;记录执行慢的SQL1. 开启慢查询日志2. 设置long_query_time3. 查看慢查询数与慢查询SQL三、分析查询语句&#xff1a;EXPLAIN1. 概述2.EXPLAIN各列的含义一、数据库服务…

【leetCode189】轮转数组

作者&#xff1a;日出等日落 专栏&#xff1a;leetCode刷题训练 要成功不需要什么特别的才能&#xff0c;只要把你能做的小事做得好就行了。 ——维龙 目录 题目&#xff1a; 第一种方法&#xff1a; 第二种方法&#xff1a; 第三种方法&#xff1a; 今…

UDP、TCP三次握手和四次挥手

-----UDP与TCP----- 相同点 tcp、udp都是工作在传输层进行数据传输&#xff08;二进制标识文本或者视频或者图片&#xff09; 不同点 tcp基于连接&#xff0c;保障传输的安全udp基于非连接&#xff0c;保障传输的速度 -----TCP的三次握手----- 过程 为什么不是两次握手&a…

PMP考试备考:你不知道的8个常考概念

PMP考试即将到来&#xff0c;为便于广大考生在考试前查漏补缺&#xff0c;给大家准备了PMP考试中常考的八个重要概念&#xff0c;包括敏感性分析、德尔菲技术等&#xff0c;快来看看吧。 01敏感性分析 敏感性分析有助于确定哪些风险对项目具有最大的潜在影响。它有助于理解项…

UWB芯片DW3000之双边双向测距法

目录 双边双向测距 使用四个信息 使用三个信息 双边双向测距 使用四个信息 双边双向测距(DS-TWR)是基本的单边双向测距的扩展&#xff0c;其中使用两次往返时间测量并结合给出飞行时间结果&#xff0c;即使在相当长的响应延迟情况下也能减少误差。 带有四个信息的双面双向…

安全多方计算之八:Mix-Match

Mix-Match1. 混合网络基于ElGamal加密方案的混合网络2. PET协议3. Mix-Match协议4. 百万富翁问题的Mix-Match解决方案M.Jakobsson和A.Juels提出了基于Mix-Match的安全多方计算协议构造方法&#xff0c;该类协议包括Mix与Match两个阶段&#xff1a; Mix阶段&#xff1a;通过构造…

详解LinkedHashSet和LinkedHashMap

目录 一.LinkedHashSet和LinkedHashMap 1.基本介绍 2.与HashSet和HashMap的区别 3.LinkedHashSet和LinkedHashMap具体的方法 1.LinkedHashSet 2.LinkedHashMap 二.模拟代码实现LinkedHashMap 三.具体应用 一.LinkedHashSet和LinkedHashMap 1.基本介绍 顾名思义,根据名…

gpt4国内可以使用吗-chatgpt国内使用的软件排行榜

gpt4国内怎么用&#xff1f; 目前 OpenAI 尚未正式发布 GPT-4 模型&#xff0c;因此目前尚无法直接使用它。预计当GPT-4发布时&#xff0c;将通过OpenAI平台提供API以供使用者调用&#xff0c;同时新的API接口可能需要在不同国家/地区进行不同程度的注册或许可等手续。 当Ope…

php 修改服务器文件上传大小限制

输入docker cp mlfnginx:/etc/nginx/conf.d/pl.conf .输入vimpl.conf 修改nginx配置文件移动到图中所示位置client_max_body_size 按键盘”i”对图中的xxM修改成需要的大小&#xff0c;然后按”esc”&#xff0c;在按”:wq”&#xff0c;最后按回车键输入docker cp ./pl.con…

寻找2020 (蓝桥杯) JAVA

题目描述 小蓝有一个数字矩阵&#xff0c;里面只包含数字0 和2。小蓝很喜欢2020&#xff0c;他想找到这个数字矩阵中有多少个2020 。 小蓝只关注三种构成2020 的方式&#xff1a; 同一行里面连续四个字符从左到右构成2020。 同一列里面连续四个字符从上到下构成2020。 在一条从…

南京邮电大学通达学院《数学实验》MATLAB实验答案

南京邮电大学通达学院《数学实验》MATLAB实验答案一 声明二 MATLAB下载三 南京邮电大学通达学院《数学实验》练习一1.11.21.31.41.51.61.71.81.91.101.11![请添加图片描述](https://img-blog.csdnimg.cn/a3d3a094f6ea4dff85c0fd0bf40bbb44.jpeg)四月维夏&#xff0c;六月徂暑。…

百度文心一言可以完胜ChatGPT的4点可能性

文心一言&#xff0c;百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。但说实话&#xff0c;很多人拿他与ChatGPT相对比&#x…

项目经理注意!掌握这5个关键点,提升效率80%!

很多项目在刚接手时&#xff0c;遇到的问题种类多并且复杂&#xff0c;乍一看很令人头疼&#xff0c;但仔细梳理下来好像也没有那么难&#xff0c;只需要厘清以下5个关键点&#xff1a; 一、做好项目的五个关键 具体的思路就是: 明确事->找对人->排计划->定机制->…

Bulk vector export as SLD and GeoJson

QGIS插件&#xff0c;可以导出所有图层的GeoJson数据格式和SLD图层样式文件。 缺点&#xff1a;导出的文件名和图层名称不对应。

数据结构与算法:滑动窗口类题目总结

滑动窗口类型题目解题框架总结&#xff1a; class Solution:def problemName(self, s: str) -> int:# Step 1: 定义需要维护的变量们 (对于滑动窗口类题目&#xff0c;这些变量通常是最小长度&#xff0c;最大长度&#xff0c;或者哈希表)x, y ..., ...# Step 2: 定义窗口…