百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

wxin55 2024-11-01 14:29 7 浏览 0 评论

简介

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

cookie

cookie的实质及实现原理

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

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

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

浏览器为了电脑的安全性,禁止js代码访问本地磁盘的数据。而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对象的属性
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

三者的使用原则

  • 尽量使用小的域

相关推荐

Java中List 和 Map、Set 的区别(list和set和map)

hello,大家好,我是霖仔java集合的大家了解,我再给大家说一下他们的区别,希望能够帮助到大家结构特点:List和Set是存储单列数据的集合,Map是存储键和值这样的双列数据的集合;Lis...

Java 集合框架全面解析:选对数据结构,提升开发效率

上一章我们详细介绍了各种常用的数据结构情况(参考:数据结构复杂度全览:如何选择最优结构?),本文结合关键数据结构,从列表(List)、队列(Queue)、集合(Set)、映射(Map)四个维度,深入解...

LinkedList竟然比ArrayList慢了1000多倍?(动图+性能评测)

数组和链表是程序中常用的两种数据结构,也是面试中常考的面试题之一。然而对于很多人来说,只是模糊的记得二者的区别,可能还记得不一定对,并且每次到了面试的时候,都得把这些的概念拿出来背一遍才行,未免有些麻...

LinkedList 底层源码深度解析(linkedlist底层数据结构)

目录1.引言2.LinkedList概述2.1类继承体系图2.2各个接口作用3.与ArrayList的对比4.底层数据结构5.核心方法源码解析5.1add()方法5.2a...

List的用法和实例详解——Java进阶知识讲义系列(四)

序欢迎来到全网最完整的Java进阶知识系列教程!!!每天定时更新!!!本期是Java进阶知识系列的第四讲,将分享Java常用的数据容器——集合类。集合类也分很多类型,比如:List、Set、Map、Q...

Rust高效集合操作(rust基本操作)

集合的分类Rust的集合类型主要分布在标准库的std::collections模块中,同时也包括语言内置的数组和字符串类型序列容器序列容器维护元素的顺序,适合需要按索引访问或顺序遍历的场景向量(...

Java八股文:核心知识点梳理(java八股文是啥)

一、Java基础1.Java基本数据类型8种基本类型:整型:byte(1),short(2),int(4),long(8)浮点型:float(4),double(8)字符型:char(2)布...

面试题:ArrayList和LinkedList有什么区别?

面试题

为什么我不推荐研发人员使用 LinkedList?

在Java集合框架中,LinkedList作为List的实现之一,经常被认为是ArrayList的替代方案。然而,在大多数实际场景下,我们并不推荐使用LinkedList,原因主要集中...

ArrayList 、 LinkedList、Vector的区别

ArrayList、LinkedList、Vector的区别如下:ArrayListLinkedListVector结构动态数组双向链表动态数组是否线程安全否否是效率遍历查找快,插入删除慢插入删除...

(2020 )Java最新面试笔试题答案解析(一)

Java中的集中基本数据类型是什么?各占用多少字节?【数值型】—(整数类型)byte(1字节)short(2字节)int(4字节)long(8字节)拓展:Java中的数据类型除了上面的基本...

超简单五步实现Linux虚拟机CentOS 7系统Root密码忘记重置

环境:CentOS7.5重置root密码:1.CentOS7虚拟机开机,将鼠标光标移动至虚拟机内。2.在虚拟机中使用键盘上↑和↓键将选择行设置为第一行(背景高亮即为选中),按下键盘上的e,进...

吊轨门和推拉门哪个好?北京今朝区别介绍看完不入坑

厨房到底使用什么门好?相信这是大多数业主都比较抓狂的事情,其实在装修中材料的选择最终还是要依据空间而定,那么吊轨门和推拉门哪个好呢?下面就跟随北京装修网一起来看看吧!吊轨门与推拉门介绍吊轨门吊轨门的特...

〖省钱宝典〗不花冤枉钱,少走弯路!居家中推拉门如何设计?

想要空间最大程度的显大?想要充足的光线?又想拥有合理的区域划分?那么推拉门是你绝对不能错过的好选择。推拉门的设计轻盈简洁,绝对是室内每个空间的福音。它不仅可以最大化地节省空间,方便了居室的功能划分和利...

吊趟门与推拉门有什么区别?(吊趟门贵还是推拉门贵)

吊趟门与推拉门的区别很多人在购买的时候并不清楚,有些客人甚至根本分不清吊趟门和推拉门,今天小编就给大家讲讲吊趟门与推拉门的相关内容,看看吊趟门与推拉门的区别有哪些?1、推拉门采用以门扇下滑轮为主支撑点...

取消回复欢迎 发表评论: