热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于java:面试知识点学习5HTTP的无状态性CookieSession原理Session共享

参考资料:(2条音讯)JavaWeb根底系列(四)Session和Cookie_小刺猬喜歡獨角獸-CSDN博客什么是Http无状态?Session、Cookie、Token三者之间
文章目录[隐藏]
  • 5.1 无状态的含意
  • 5.2 COOKIE和session技术 ——会话技术
  • 5.3 Session共享

参考资料:

(2条音讯) JavaWeb根底系列(四)Session和COOKIE_小刺猬喜歡獨角獸-CSDN博客

什么是Http无状态?Session、COOKIE、Token三者之间的区别 – 翎野 – 博客园 (cnblogs.com)

Java面试高级篇—Session和COOKIE的区别与分割面试题12期 – yoodb – 素文宅博客

集群间如何实现session共享【面试+工作】 – 云+社区 – 腾讯云 (tencent.com)

5.1 无状态的含意

协定对于事务处理没有记忆性能。短少状态意味着,如果前面的解决须要后面的信息,则后面的信息必须重传,这样可能导致每次连贯传送的数据量增大。另一方面,在服务器不须要后面信息时,应答就较快。

直观地说,就是每个申请都是独立的,与后面的申请和前面的申请都是没有间接分割的。

为什么不改良http协定使之有状态:

最后的http协定只用来浏览动态文件的,无状态协定曾经足够,这样实现的累赘很轻。

随着web的倒退,它须要变得有状态,然而不须要批改http协定使之有状态。因为咱们常常长时间勾留在某一个网页,而后才进入到另一个网页,如果在这两个页面之间维持状态,代价很高。

5.2 COOKIE和session技术 ——会话技术

HTTP自身是一个无状态的连贯协定,为了反对客户端与服务器之间的交互,咱们引入会话技术为交互存储状态,会话技术分为COOKIE和Session。

会话技术定义:

    从关上一个浏览器拜访某个站点,到敞开这个浏览器的整个过程,称为一次会话。

会话技术就是记录这次会话中客户端的状态与数据的。

5.2.1 COOKIE

  • 将用户的数据存储到客户端,缩小服务器端的存储的压力,安全性不好,客户端能够革除COOKIE。
  • COOKIE具备不可跨域名性,即浏览器拜访不同的域名只会携带该域名对应的COOKIE,某一域名也只能操作该域名的COOKIE。

    COOKIE在客户端由浏览器来治理,浏览器可能保障COOKIE的不可跨域名性,从而保障用户的隐衷平安。

  • 工作原理:给每个客户端颁发一个通行证,无论谁拜访都必须携带本人通行证。这样服务器就能从通行证上确认客户身份。
  • 实现办法:把登录信息如账号、明码等保留在COOKIE中,并管制COOKIE的有效期,下次访问时再验证COOKIE中的登录信息即可。
  • 实现计划:

    • 计划一:最间接的是把用户名与明码都放弃到COOKIE中,下次访问时查看COOKIE中的用户名与明码,与数据库比拟。这是一种比拟危险的抉择,个别不把明码等重要信息保留到COOKIE中。 很危险
    • 计划二:把明码加密后保留到COOKIE中,下次访问时解密并与数据库比拟。这种计划稍微平安一些。如果不心愿保留明码,还能够把登录的工夫戳保留到COOKIE与数据库中,到时只验证用户名与登录工夫戳就能够了。 依然危险
    • 计划三:只在登录时查问一次数据库当前拜访验证登录信息时不再查询数据库

      本计划把账号保留到名为account的COOKIE中,把账号连同密钥用MD5算法加密后保留到名为ssid的COOKIE中。只需验证account账号与密钥加密后,是否与ssid相等。

      该加密机制中最重要的局部为算法与密钥。因为MD5算法的不可逆性,即便用户晓得了账号与加密后的字符串,也不可能解密失去密钥。因而,只有保存好密钥与算法,该机制就是平安的。

5.2.2 Session

  • 将数据存储在服务器端,安全性绝对好,占用服务器资源,减少服务器的压力;
  • 原理: 为每个客户端都创立一块内存空间存储客户的数据,但客户端须要每次都携带一个Session ID去服务器中寻找属于本人的内存空间。所以说Session的实现是基于COOKIE,Session须要借助于COOKIE存储客户的唯一性标识Session ID
  • 类比:相当于程序在服务器上建设的一份客户档案,客户来访的时候只须要查问客户档案表就能够了。
  • 创立:第一次执行request.getSession()时创立
  • 销毁:

    • 服务器(非正常)敞开时;
    • session过期/生效(默认30分钟,从不操作服务器端的资源开始计时);
  • 实现形式:

    个别浏览器提供了两种形式来保留,还有一种是程序员应用html暗藏域的形式自定义实现:

    1)应用COOKIE来保留,这是最常见的办法。服务器通过设置COOKIE的形式将Session ID发送到浏览器。如果咱们不设置这个过期工夫,那么这个COOKIE将不寄存在硬盘上,当浏览器敞开的时候,COOKIE就隐没了,这个Session ID就失落了。

    如果咱们设置这个工夫为若干天之后,那么这个COOKIE会保留在客户端硬盘中,即便浏览器敞开,这个值依然存在,下次访问相应网站时,同样会发送到服务器上。

    2)应用URL附加信息的形式,也就是像咱们常常看到JSP网站会有aaa.jsp?JSESSIOnID=*一样的。这种形式和第一种形式外面不设置COOKIE过期工夫是一样的。

    3)在页面表单外面减少暗藏域,这种形式实际上和第二种形式一样,只不过前者通过GET形式发送数据,后者应用POST形式发送数据。然而显著后者比拟麻烦。

5.2.3 COOKIE和Session的关系

  • COOKIE 是一个理论存在的、具体的货色,http 协定中定义在 header 中的字段。
  • session 是一个抽象概念。开发者为了实现中断和持续等操作,将client和server之间一对一的交互,形象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。
  • session形容的是一种通信会话机制,而COOKIE只是实现这种机制的支流计划外面的一个参与者,它个别是用于保留session ID。

5.3 Session共享

5.3.1 Session-COOKIE技术运行过程

  • 用户登录时,申请达到服务器,服务器调用通过getSession()办法判断session是否存在,如果不存在,则新建session,并通过其算法为session生成一个随机数作为sessionId,开发者可在session中贮存一些用户信息;

    第二次申请时,如获取用户信息,getSession()办法判断session存在,则取出session,而不是新建,从而从session中获取到用户的相干信息。

  • 客户端申请时,将COOKIE信息贮存于request的head中发送给服务器;
  • 服务器响应时,将COOKIE信息置于response中回传给客户端。

5.3.2 getSession()办法做了什么

  • 第一次用户申请,客户端本地没有任何数据,即COOKIE为空,朝服务器发送request,getSession()中会解析request,发现其约定的COOKIE为null,则认为没有session,所以会从新创立一个session对象;
  • 创立session后,会将此session的id放入response中,回传给客户端,客户端则保留response中的COOKIE;
  • 再次申请,服务器getSession()又会从新解析request获取COOKIE,发现了其中的sessionId,那么依据此sessionId去服务器的中去找,则失去了上次创立的session对象,那么则认为鉴权胜利
  • Java伪代码(图源见水印):

5.3.3 如何实现session共享

​ 依照下面所说的session-COOKIE机制,session是保留在每台服务器的,但在集群中,领有多台服务器,每台各自为政,势必会造成在这台服务器中登录,获取session胜利,然而到另一台服务器上,又会获取不到session,造成鉴权失败,这样对用户来说极不敌对。

  • 几种解决形式:

    • 1. 找一块公共的空间用来贮存session,而不是将session贮存在集群节点的某台服务器上,此时,每一台服务器都能拜访这块空间,从而实现session共享;
    • 2. 采纳一种同步机制实时同步每一台服务器的session信息;
  • 实现计划:

    • 长久化session到数据库,即应用数据库来贮存session。数据库正好是咱们广泛应用的公共贮存空间,例如应用mysql数据库。

      长处:就地取材,合乎大多数人的思维,应用简略,不须要太多额定编码工作

      毛病:对mysql性能要求较高,拜访mysql须要从连接池中获取连贯,又因为大部分申请均须要进行登录鉴权,所以操作数据库十分频繁,当用户量达到肯定水平之后,极易造成数据库瓶颈,不适用于解决高并发的状况。

    • 应用redis共享session。redis是一个key-value的贮存零碎。能够简略的将其了解为一个数据库,与传统数据库的区别是,它将数据贮存于内存中,并自带有内存到硬盘的序列化策略,即按策略将内存中的数据同步到磁盘,防止数据失落,是目前比拟风行的解决方案。

      长处:无需减少数据库的压力,因为数据存储于内存中,所以读取十分快,高性能,并能解决多种类型的数据。

      毛病:额定减少一些编码,以便操作redis。

    • 应用memcache同步session,memcache能够实现分布式,可将服务器中的内存组合起来,造成一个“内存池”,以此充当公共空间,保留session信息。

      注:MemCache是一个自在、源码凋谢、高性能、分布式的分布式内存对象缓存零碎,用于动静Web利用以加重数据库的负载。它通过在内存中缓存数据和对象来缩小读取数据库的次数,从而进步了网站拜访的速度。

      长处:数据贮存在内存中,读取十分快,性能好

      毛病:memcache把内存分成很多种规格的存储块,有大有小,不能齐全利用内存,会产生内存碎片,浪费资源,如果贮存块有余,还会产生内存溢出

    • 应用NFS共享session。NFS是Network File Server共享服务器的简称,最早由Sun公司为解决Unix网络主机间的目录共享而研发。抉择一台公共的NFS做共享服务器,贮存所有session数据,每台服务器所需的session均从此处获取。

      长处:较好的实现了session共享;

      毛病:老本较高,对于集体来说难以实现。NFS依靠于简单的平安机制和文件系



推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文介绍了一个Magento模块,其主要功能是实现前台用户利用表单给管理员发送邮件。通过阅读该模块的代码,可以了解到一些有关Magento的细节,例如如何获取系统标签id、如何使用Magento默认的提示信息以及如何使用smtp服务等。文章还提到了安装SMTP Pro插件的方法,并给出了前台页面的代码示例。 ... [详细]
  • 安装oracle软件1创建用户组、用户和目录bjdb节点下:[rootnode1]#groupadd-g200oinstall[rootnode1]#groupad ... [详细]
author-avatar
cc晨晨V_842
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有