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

网络基础 http 会话(session)详解

http会话(session)详解by:授客QQ:1033553122会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作

http 会话(session)详解

by:授客 QQ1033553122

会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制

一、查看session id

可利用相关工具,比如firebug,httpwatch等查看会话id

以下是访问某个网站页面(记为页面1)http请求头信息

网络基础 http 会话(session)详解网络基础 http 会话(session)详解

  

从上图可看到,访问页面1时的session id abcmiPGuZcZTqaNNnLUHu

 

以下是访问另一个网站的页面(记为页面2)http请求头信息

网络基础 http 会话(session)详解网络基础 http 会话(session)详解

 


 

从上图可看到,访问页面2时的session id:b035123e4066ec2b270c5fc07260b08f

 

说明:

1.  可通过COOKIE中的会话标记:session name=session id,来查找session id,其中,session name,即会话名称,称默认为JSSESSIONID(jsp, weblogic)PHPSESSID(PHP),可通过函数自定义

2.  session name,只能包含字幕,数字,且至少包含一个字母

3.  访问不同网站的页面,生成的会话id不一样

 

二、会话机制

会话机制是一种服务器端的机制,服务器使某种数据结构(可能是散列表)来保存信息

会话过程如下:

1、客户端-----发送请求----->服务器

2、服务器检查请求是否含有session id,根据不同情况采取不同的操作

分两种情况

a)   情形一:请求中含有session id

根据session id检索对应的会话信息,如果检索不到(会话信息因超时被删除),则创建用于保存会话信息的文件或某种数据结构变量,并生成与文件或数据结构变量关联的session id

注:请求中含有session id,说明服务器已经为客户端保存过会话信息;

b)   情形二:请求中不含session id

创建用于保存会话信息的文件或某种数据结构变量,并生成与文件或数据结构变量关

联的session id

3、session id以响应报文的方式发送给客户端,如果客户端的请求中不含session id,那么服务器还会给出指令,指示客户端保存session id,如下图,客户端首次向服务器发起请求时,可看到,客户端收到的请求头包含Set-COOKIE

网络基础 http 会话(session)详解

 

   网络基础 http 会话(session)详解
 

说明:从图上可看出,COOKIE是由服务器下发的

4、客户端再次发起访问其它或相同页面请求时,会自动在请求中发送COOKIE中保存的session id。如下图,再次发送请求时发送的请求头(注:前提是存在session id且还有效,比如未关闭浏览器的情况下)

网络基础 http 会话(session)详解

 

 

网络基础 http 会话(session)详解

说明:

1.客户端通常是浏览器

2.session id唯一,一个session id 代表着一次会话

 

测试(IE8)

步骤1、禁用浏览器COOKIE

网络基础 http 会话(session)详解

网络基础 http 会话(session)详解

 

 

步骤2、重复访问某网站后查看COOKIEs,查看请求头

 网络基础 http 会话(session)详解

网络基础 http 会话(session)详解

 

网络基础 http 会话(session)详解

网络基础 http 会话(session)详解

结果:禁用浏览器COOKIE,可看到COOKIEs的状态为Received,收到请求头信息一直是Set-COOKIE

 

步骤3、启用浏览器COOKIE,重复两次访问网站后查看COOKIEs

网络基础 http 会话(session)详解
网络基础 http 会话(session)详解

 

 

结果:开启COOKIE,第二次访问网站后,COOKIEs状态,状态为Sent

 

URL重写

由于COOKIE可以被人为的禁止,必须有其他机制确保COOKIE被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写:把session id直接附加在URL路径的后面:一种是作为URL路径的附加信息,表现形式为:

http://...../xxx;jsessiOnid=ByOK ... 99zWpBng!-145788764

另一种是作为查询字符串附加在URL后面,表现形式:http://...../xxx?jsessiOnid=ByOK ... 99zWpBng!-145788764

这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。

为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id

 

三、会话生存期

先进行以下测试:

1.  删除本地COOKIE,同一浏览器,不同标签中打开相同站点的相同页面,查看session id是否变化

结果:每个标签中访问页面时看到的session id一样

2.  删除本地COOKIE,同一浏览器,不同标签中打开相同站点的不同页面,查看session id是否变化

结果:站点相同,访问不同页面时看到的session id一样

3.  删除本地COOKIE,不同浏览器(类型相同,比如都为ie),打开相同网站的相同页面,查看,查看session id是否变化

结果:访问同一页面时,session id都保持不变

4.  记录当前session id,删除COOKIE,关闭标签页面,再次打开相同站点的相同页面,查看session id是否变化

结果:未关闭浏览器的情况下,session id保持不变

5.  记录当前session id,关闭所有浏览器,再次打开相同站点的相同页面,查看session id是否变化

结果:session id改变了

6.  不同类型的浏览器中,打开相同站点的相同页面,查看session id是否变化

结果:session id改变了

7.  第二天再次访问相同站点的相同页面,查看session id是否变化

结果:session id改变了

 

到此可以得出结论:

1.  通常,会话生存期为:

开始:客户端(通常是浏览器)--发送第一个请求-->服务器,彼此成功建立连接

结束:关闭客户端(通常是浏览器)或者会话超时

2.  不同浏览器访问相同站点时页面时,会生成不同的会话

3.  这里的COOKIE,保存在浏览器内存中不是写到硬盘上,我们称之为session COOKIE,session COOKIE针对某一次会话而言,会话结束,session COOKIE也就随着消失

 

注意:

1.  之所以说“通常”,是因为客户端发送页面请求不一定会创建会话,当server端程序调用了类似HttpServletRequest.getSession(true)这样的语句时,会话才真正被创建。

2.  访问本地xx.html页面,不会创建会话

 

关于“会话超时”

http协议中,客户机不再活跃时没有明确的终止信号.所 以借助超时来标识规定时间内不活跃的客户机,当不活跃时间超过规定时间时,自动结束会话,这样有助于节省资源。举个例子,当你登录一个网站,但是有事情, 离开电脑,老半天没进行网页浏览等与服务器交互的操作,当你回来时,点击某个超链接,它自动提示你要重新登录。这就是个典型的例子。
 

四、会话信息生存期

  1. 当距离客户端上一次使用会话信息的时间超过了规定的“超时”时间,服务器就认为客户端已经停止了活动,自动删除保存的会话信息
  2. 服务器程序调用HttpSession.invalidate()时,删除会话信息
  3. 服务器关闭或服务停止(对非持久会话而言),会删除会话信息

注意:除非客户端通知服务器删除会话变量,否则服务器不会主动删除。一般都是在用户做log off的时候发个指令去删除会话信息,浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,所以大部分会话机制都使用session COOKIE来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的会话信息。所以,服务器为每个会话设置了一个失效时间,当距离客户端上一次使用会话信息的时间超过这个失效时间时,则把会话信息删除以节省存储空间。

但是如果服务器设置的COOKIE被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。

测试验证:

访问某网站,获取请求头,方法,请求页面(可用firebug)

关闭浏览器,然后重新打开,手动编辑请求,发送请求,发现确实可以获取。

 

五、会话和COOKIE

采用网络上一个经典的比拟

某咖啡店对顾客推出促销活动:连续购买5杯咖啡,可赠送一杯,而通常消费者不会一次性买5杯的,所以不管任何时候,店家必须知道每位顾客的消费数量,才有办法判断是否满足赠送条件

有以下二种比较可行的处理方式:

1、给每位顾客一张卡片,上面记录着顾客消费的数量(一般还有个有效期限),每次消费时,如果顾客出示这张卡片,则此次消费就会与之前或以后的消费相联系起来--这种做法就是在客户端保持状态。

2、给每位顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息--这种做法就是在服务器端保持状态。

 

由于HTTP协议是无状态的,浏览器每次访问不同的web页面时,服务器都会去打开新的会话,而且服务器也不会自动维护客户的上下文信息(就是说你在这个页面存储的变量的值不会带到下一个页面去) , 客户端只需要简单的向服务器请求获取资源,无论是客户端还是服务器都不纪录彼此过去的行为,每一次请求之间都是独立的,拿上述咖啡点的例子来说,也就是顾 客不记得之前什么时候去过咖啡店,购买了多少杯咖啡,店家也不记得顾客是否去过自家店,是否买过,买了多少杯咖啡等信息。

 

但是我们有时候,我们需要有状态,比如上面的咖啡店例子,再比如购物车机制,在某个页面把某物品放入购物车,当访问在其它页面时,依然可见该购物车中的物品,这就需要会话(session)这样一种保存上下文信息的机制,session是针对每一个用户的,通过session id来区分不同的用户

 

拿上述例子来说,

COOKIE采用的是在客户端保持状态的方案,而session采用的是在服务器端保持状态的方案,从咖啡店的例子来看,在服务器端保持状态会比较好。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识(session id),所以session可能需要借助于COOKIE来达到保存标识的目的,之所以说可能,是因为还有其它途径,比如url重写

 

 


推荐阅读
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文介绍了DataTables插件的官方网站以及其基本特点和使用方法,包括分页处理、数据过滤、数据排序、数据类型检测、列宽度自动适应、CSS定制样式、隐藏列等功能。同时还介绍了其易用性、可扩展性和灵活性,以及国际化和动态创建表格的功能。此外,还提供了参数初始化和延迟加载的示例代码。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
author-avatar
--Fac_k-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有