`

关于“无状态的HTTP连接提供有状态的连接"

 
阅读更多
HTTP是无状态链接,请求-回应完毕后客户端和服务器之间的链接就会断开。那么服务器是如何记住用户的,例如网上购物车,每次新添加购物项,上次添加的 购物项还能存在,这是如何实现的?可以推测应该是客户端或服务器端将购物的信息记录下来,创建一个新的链接时候读取记录下来的数据,这样就实现无状态的 HTTP连接提供有状态的连接的效果。

服务器端:

在网络服务器看来,所有的HTTP请求都独立于之前的请求,也就是说他只识别你这次请求头中包含的信息,然后做出对应的响应。状态管理机制克服了HTTP 的一些限制并允许网络客户端和服务器端维护请求间的关系,这种关系维持的期间叫做Session(会话)。Session是服务器端的一种保存上下文信息 的机制,它是针对每一个用户的,session的值保存在服务器端。当服务器端程序需要为客户端请求创建一个session的时候,会首先检查请求中是否 包含了一个session标识—sessionID,如果包含sessionID,说明以前就已经为该用户创建过session,服务器会直接按照这个 sessionID将对应的session检索出来使用(没有检索到可能会新建一个);如果客户端请求没有包含sessionID,则为这个用户新建一个 session并生成一个相关联的sessionID(sessionID的值应该是一个不会重复,也不容易找到规律的字符串),这个sessionID 将在本次响应中返回给客户端保存。

购物车例子:

当你买第一个物品的时候点击“购买”,浏览器将请求发送到服务器(该请求中没有sessionID,因为这是你要买的第一个物品,之前没有和服务器 交互),服务器发现没有sessionID,就会为客户端创建一个session和与之相关联的sessionID,并把刚创建的这个sessionID 在本次响应中返回给客户端,客户端的浏览器接收到返回的响应把这个sessionID存储,当你再次向购物车添加物品时候,浏览器会在后台自动将你存储的 sessionID发送给服务器,服务器按照这个sessionID检索到对应的session,然后进行处理返回给你页面,这样你才能够看到上次添加的 购物项。

客户端:

在客户端用来存储服务器返回的sessionID和其他一些信息的称为cookie。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过 在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie,在交互的时候浏览器检查所有存储的cookie,如果某个 cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。可以使用HEAD命令 得到服务器的响应头,有的网站响应头中包含set-cookie项(例如hi.baidu.com),该项中包含一个名值对,过期时间,路径和域,这些都 是由服务器指定。路径就是跟在域后面的url路径,路径和域组成了cookie的作用范围的大小;设置过期时间,就会将cookie保存到硬盘上,关闭浏 览器再打开,cookie依然有效,直到请求的时间超过了指定的时间。如果不设置过期时间,则cookie一般不存储在硬盘上而是保存在浏览器的内存里, 当然这种行为并不是规范规定的。所以cookie有两种,一种是存储到本地的文本文件之中的,叫做persistent (持久化的)cookie;另一种是并不存储在本地硬盘之中,而是放在浏览器的内存里面,我叫做session cookie。Persistent cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于session cookie,不同的浏览器有不同的处理方式,有的浏览器可以跨窗口使用比如Firefox,有的不能比如IE但是IE允许一个窗口生成的窗口(子窗口) 共享session cookie。

推测:如果客户端禁用cookie,那么将无法向购物车中添加物品。

禁用IE的cookie,访问当当网,选中一本书,点击购买,发现返回的页面为空白页面,并没有我购买的书;允许使用cookie,购买返回的页面中购买 的书已被添加到购物车之中。说明推测是正确的。可是如果禁用浏览器的cookie就无法访问需要创建session的服务器了吗?由于cookie可以被 人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id 直接附加在URL路径的后面,这样服务器就可以解析url地址后面的sessionID进行处理。发送SessionID有两种方式,一种就是将 sessionID存放在cookie里面浏览器自动发送;另一种是当客户端禁用cookie时,通过URL重写将sessionID发送给服务器。
关于“无状态的HTTP连接提供有状态的连接
Session的生命周期:

Session什么时候会被服务器删除,有人可能会认为当客户端的浏览器窗口关闭时候session就会被删除,其实不然。事实上除非程序通知服务器删除 一个session,否则服务器会一直保留。浏览器关闭之前不会通知服务器,所以服务器不会知道浏览器什么时候关闭,之所以有“浏览器关 闭,session就消失”这样的感觉,是因为大多数的session机制都是用会话 cookie(session cookie)来保存sessionID,这样浏览器关闭之后sessionID就消失了,再次连接服务器时候,分配了新的sessionID,也就不能 找到以前那个session了,但是如果用persistent cookie来保存sessionID的话,再打开新的浏览器也能够找到那个sessionID加到请求之中,服务器就能够找到那个session。由于 浏览器的关闭或者浏览器的进程被强行杀死或者断网,服务器都无法知道,所以服务器设置了一个失效时间,只要距离客户端上次访问的时间超过了失效时间,则认 为客户端活动停止了,此时删除session节省存储空间。

例子:登录电子邮箱,长时间(超过失效时间)没有操作,再对邮箱操作的话页面刷新之后提示你页面已经过期,此时session已经被删除。

总结:HTTP是无状态链接,因为要实现有状态链接的效果,所以采用session和cookie两种机制。 客户端请求需要包含服务器指定的唯一的sessionID,如果请求中没有sessionID,服务器将为该请求创建一个session和与之相关联的 sessionID并把这个sessionID放入响应之中,并加上一行特殊的指示以提示浏览器按照指示生成相应的cookie,将响应返回给客户端,客 户端的浏览器按照规则解析响应,如果浏览器支持cookie则将sessionID和其他信息存储起来(persistent cookie 或者session cookie),下次再次访问同一服务器时候浏览器将对应的cookie和请求头一起发送给服务器,服务器按照sessionID进行检索找到对应的 session进行处理。
分享到:
评论

相关推荐

    获取网络连接状态实例demo

    在Android开发中,获取设备的网络连接状态是常见的需求,比如检查用户是否已经连接到互联网,以便决定是否加载网络数据或者执行网络相关的操作。本文将详细介绍如何在Android中实现一个获取网络连接状态的实例。 ...

    Linux或Windows下判断socket连接状态

    其中,`TCP_INFO`结构体可以提供更详细的信息,包括连接状态(如ESTABLISHED、CLOSE_WAIT等)。我们可以通过以下步骤获取TCP连接状态: 1. 使用`getsockopt(socket_fd, IPPROTO_TCP, TCP_INFO, &tcp_info, &len)`,...

    android监听蓝牙设备的连接状态

    通过以上步骤,你就能在Android应用中实现对蓝牙设备连接状态的有效监听和管理,从而为用户提供更丰富的交互体验。当然,实际项目中可能会有更多复杂情况,例如错误处理、状态恢复等,需要根据具体需求进行相应的...

    labview tcp 检查连接状态.png

    labview tcp 检查连接状态.png labview tcp 检查连接状态.png

    TCP/UDP连接状态查看

    3. **UDP连接状态**:由于UDP是无连接的,所以没有传统意义上的“连接状态”。但我们可以查看哪些UDP端口正在发送或接收数据。 文件名为“cports.exe”的程序可能是一个实用工具,用于显示这些详细信息。它可以帮助...

    C#判断网络连接状态例子(winform)

    在.NET框架中,尤其是C#编程环境下,开发者经常需要处理与网络相关的任务,其中之一就是判断用户的网络连接状态。本文将详细讲解如何在Windows Forms(Winform)应用中实现这一功能,以便于创建更加智能和用户友好的...

    iOS网络连接状态判断 JPNetwork

    总的来说,"iOS网络连接状态判断 JPNetwork"库为iOS开发者提供了一个便捷的工具,使得网络状态的检测变得更加容易,从而能够更好地适应各种网络环境,提高应用的稳定性和用户体验。它的易用性和实用性使其成为许多...

    Android 利用广播监听usb连接状态(变化情况)

    在Android开发中,监听USB连接状态是一个常见需求,尤其是在涉及到需要与USB设备通信的应用场景中。当USB设备插入或者拔出时,应用程序可能需要执行相应的操作,比如启动服务、弹出提示信息等。为了实现这一功能,...

    WLANAPI - 能正常连接wifi和判断连接状态.rar

    7. **连接状态判断**:程序能够自动判断无线网络的连接状态,这可能涉及到定期查询WLANAPI提供的连接信息,例如检查网络是否已连接,信号强度,数据传输状态等。 8. **错误处理**:在实际应用中,良好的错误处理...

    时时监听网络状态/判断网络连接情况

    2、判断网络连接状态的方法(如mobile网络和wifi网络) 3、用广播WifiManager.NETWORK_STATE_CHANGED_ACTION和ConnectivityManager.CONNECTIVITY_ACTION都行,但判断连接是否成功时,用NetworkInfo的getState()方法...

    android wifi连接打印机并获取打印机状态

    在Android平台上实现无线Wi-Fi连接打印机并获取打印机状态是一项实用且技术性强的任务。本文将深入探讨这个主题,基于提供的博客链接以及"KitchenPrintDemo1"这个项目文件名,我们可以推测这是一个示例应用,用于...

    c# 监测当前网络连接状态

    用于监测当前网络连接状态,使用C#编写 if (IsConnectedToInternet()) MessageBox.Show("已连接在网上!","提示"); else MessageBox.Show("未连接在网上!!","提示");

    编程获取网络连接状态

    Android编程获取网络连接状态(3GWifi)及调用网络配置界面

    安卓 手机连接蓝牙耳机状态测试

    开发者可以通过日志打印或者UI更新来显示当前的连接状态,例如在Java文件顶部的提示信息。 6. **异常处理**:在实际开发中,我们需要处理各种可能的异常情况,比如蓝牙未开启、设备未找到、连接失败等。通过异常...

    利用文本框判断wincc与PLC的连接状态

    当WinCC与PLC之间建立或断开连接时,可以通过改变变量的值来更新文本框的内容,以此来直观地反映当前的连接状态。具体步骤如下: #### 1. 变量配置 首先,在WinCC项目中定义一个变量,该变量用于存储连接状态的信息...

    使用JS在浏览器中判断当前网络连接状态的几种方法

    使用JS在浏览器中判断当前网络状态的几种方法如下: 1. navigator.onLine 2. ajax请求 3. 获取网络资源 4. bind() 1. navigator.onLine 通过navigator.onLine判断当前网络状态: if(navigator.onLine){ ... }...

    网络连接状态测试程序(VB6.0源代码编写)可以查看网络通不通

    在VB6.0中实现网络连接状态测试,开发者通常会使用Winsock控件或者API函数,如Winsock Control,它提供了一种简单的方式来处理TCP/IP协议。程序可能包含以下关键步骤: 1. 初始化Winsock控件:设置主机地址和端口号...

    安卓开发-判断网络连接状态

    // 遍历所有网络信息,检查是否至少有一个网络处于连接状态 for (int i = 0; i ; i++) { System.out.println(i + "===状态===" + networkInfo[i].getState()); System.out.println(i + "===类型===" + ...

    通过T-DIAG指令对S7或TCP通信进行连接状态诊断的具体方法.docx

    Tdiag_Status结构体包含了多种关于通信连接状态的信息,如连接状态(State)、错误代码(Error_code)等。通过这种方式,你可以将T-DIAG指令的结果存储在这个结构体变量中,然后在程序中进一步处理。 将T-DIAG指令...

    tcp连接状态详解 描述了tcp协议常用的命令

    TCP 连接状态详解 TCP 连接状态是指在 TCP 协议中,连接的不同阶段所对应的状态。这些状态包括 LISTEN、SYN-SENT、SYN-RECEIVED、ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、CLOSING、LAST-ACK、TIME-WAIT...

Global site tag (gtag.js) - Google Analytics