HTTP是Hyper Text Transfer Protocol的缩写,顾名思义,这个协议支持着超文本的传输。那么什么是超文本呢?说白了就是使用HTML编写的页面。通常,我们使用客户端浏览器访问服务器的资源,最常见的URL也是以html为后缀的文件。因此,我们可以说超文本是网络上最主要的资源。
既然HTTP协议的目的在于支持超文本的传输,更加广义一些就是支持资源的传输,那么在客户端浏览器向HTTP服务器发送请求,继而HTTP服务器将相应的资源发回给客户端这样一个过程中,无论对于客户端还是服务器,都没有必要记录这个过程,因为每一次请求和响应都是相对独立的,就好像你在自动售货机前投下硬币购买商品一样,谁都不会也不需要记住这样一个交易过程。一般而言,一个URL对应着唯一的超文本,而HTTP服务器也绝对公平公正,不管你是Michael,还是Jordon,它都会根据接收到的URL请求返回相同的超文本。正是因为这样的唯一性,使得记录用户的行为状态变得毫无意义,所以,HTTP协议被设计为无状态的连接协议符合它本身的需求。
然而,随着时间的推移,人们发现静态的HTML着实无聊而乏味,增加动态生成的内容才会令Web应用程序变得更加有用。于是乎,HTML的语法在不断膨胀,其中最重要的是增加了表单(Form);客户端也增加了诸如脚本处理、DOM处理等功能;对于服务器,则相应的出现了CGI(Common Gateway Interface)以处理包含表单提交在内的动态请求。在这种客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
Cookie是通过客户端保持状态的解决方案。从定义上来说,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。让我们说得更具体一些:当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息,当然这些信息并不是存放在HTTP响应体(Response Body)中的,而是存放于HTTP响应头(Response Header);当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置,对于Windows操作系统而言,我们可以从:[系统盘]:\Documents and Settings\[用户名]\Cookies目录中找到存储的Cookie;自此,客户端再向服务器发送请求的时候,都会把相应的Cookie再次发回至服务器。而这次,Cookie信息则存放在HTTP请求头(Request Header)了。
有了Cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。通常,我们可以从很多网站的登录界面中看到“请记住我”这样的选项,如果你勾选了它之后再登录,那么在下一次访问该网站的时候就不需要进行重复而繁琐的登录动作了,而这个功能就是通过Cookie实现的。
与Cookie相对的一个解决方案是Session,它是通过服务器来保持状态的。由于Session这个词汇包含的语义很多,因此需要在这里明确一下Session的含义。首先,我们通常都会把Session翻译成会话,因此我们可以把客户端浏览器与服务器之间一系列交互的动作称为一个Session。从这个语义出发,我们会提到Session持续的时间,会提到在Session过程中进行了什么操作等等;其次,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。从这个语义出发,我们则会提到往Session中存放什么内容,如何根据键值从Session中获取匹配的内容等。
要使用Session,第一步当然是创建Session了。那么Session在何时创建呢?当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。有关Session的内容还比较多,在以后的Post中,我还将继续讲述。
综上所述,HTTP本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是Cookie和Session了。
分享到:
相关推荐
状态机在单片机编程中...虽然状态机看似增加了设计复杂性,但它们能有效地提高代码的可读性和可维护性,是软件设计中不可或缺的工具。通过熟练掌握状态机的原理和使用,开发者能够编写出更加高效、优雅的单片机程序。
### 浅谈HTTP协议与REST架构 #### HTTP协议概述 HTTP(Hypertext Transfer Protocol)是一种应用层协议,主要用于从Web服务器传输超文本文档至本地浏览器的传送协议。它采用客户端/服务器模式,通过TCP/IP进行通信...
《大规模电力系统状态估计浅谈》这篇文章主要探讨了随着电力系统规模的扩大,传统状态估计方法面临的挑战以及基于相量测量单元(PMU)的广域测量系统(WAMS)在状态估计中的重要作用。文章强调了PMU在提升状态估计...
状态估计在海上油田孤岛电力系统中的应用与必要性 海上油田孤岛电力系统的状态估计是一种先进的电力系统管理技术,其主要目标是通过利用SCADA系统提供的量测数据,结合电网的拓扑结构和设备参数,计算出电力系统的...
【标题】:“浅谈如何掌握学生心理状态” 【描述】:该文档主要探讨了如何理解和掌握学生心理状态,包括观察、分析和心理测量三个关键方面,旨在帮助教师更好地理解学生的行为背后的心理动因。 【标签】:“文档”...
指出了电力设备开展状态检修的必要性, 介绍了国网开展状态检修的进展和开展状态检修需要注意的问题。对目前 状态检修工作中存在的问题进行了分析, 给出了开展状态检修的几点意见。
电力系统状态检修是一种现代化的设备管理方式,旨在提高设备运行的可靠性、效率和安全性,同时降低维护成本。传统的定期检修制度往往过于机械,无法灵活适应设备的实际运行状况,因此随着新技术的发展,状态检修逐渐...
标题和描述中提到的文档是一篇关于驾驶员健康心理知识的论文,主要探讨了驾驶员的心理状况对行车安全的重要性以及常见的不良驾驶心理对平安驾驶的影响。这篇论文着重强调了驾驶员身心健康对于预防交通事故的关键作用...
尤其在快节奏的现代生活中,良好的形体与气质不仅能够提升个人的外在形象,更能体现内在的健康状态和生活品质。这篇论文深入探讨了形体训练如何帮助人们培养出优秀的气质体态,以及其对个人身心健康、社交互动、职业...
以下是对"浅谈提高离心泵的可靠性"这一主题的详细探讨。 一、离心泵的工作原理与组成部分 离心泵主要由电机、泵壳、叶轮、轴、密封装置等部分组成。工作时,电机驱动叶轮旋转,流体在叶轮离心力的作用下获得能量,...
状态检修是现代电力系统中推崇的检修模式,它基于设备的实际状态和数据分析来确定检修的时间和内容,具有针对性和实时性。状态检修的核心流程包括数据收集、设备状态评价、风险评估、检修策略制定、检修计划、检修...
相比之下,面向对象编程将数据和操作封装在一起,形成对象,从而增强了代码的稳定性和可重用性。此外,面向对象的设计还引入了类的概念,类作为一种模板,定义了一组对象的公共属性和行为,支持代码的重用和维护。 ...
锂离子电池是当前动力电池的最佳选择,其优点在于工作电压高、能量密度高、循环寿命长、无记忆效应,但是它也存在一些缺点,如能量密度进一步提升困难,容易产生安全问题,并且充电时间长,低温充电性能不好,造价...
"浅谈电力系统无功功率补偿" 摘要:本文讨论了电力系统中的无功功率补偿问题,分析了影响功率因数的主要因素,如变压器轻负荷运行、大量电感性设备、供电电压超出规定范围等,并提出了无功补偿的原则和方法。 ...
过渡和动画让元素在状态变化时有平滑的视觉效果。CSS变量则允许我们在一处定义样式值,在多处复用,提高了代码的可维护性和一致性。 通过这三个部分的学习,你可以掌握创建动态、响应式的网页所需的基本技能,并...
《GMP状态标识之浅谈》的文档详细阐述了在药品生产过程中,为了确保产品质量,遵循GMP(Good Manufacturing Practice)规范所实施的状态标识管理。这些标识主要用于防止混淆、差错、污染和交叉污染,涉及的领域包括...
### 浅谈用户体验与界面设计 #### 一、以用户为中心的设计原则 用户体验设计的核心是“以用户为中心”(User-Centered Design, UCD),它强调从用户的需求和感受出发来设计产品。这一原则下的设计理念主要包括以下...