`

浅谈HTTP的无状态性

 
阅读更多
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协议与REST架构 #### HTTP协议概述 HTTP(Hypertext Transfer Protocol)是一种应用层协议,主要用于从Web服务器传输超文本文档至本地浏览器的传送协议。它采用客户端/服务器模式,通过TCP/IP进行通信...

    浅谈cache memory

    《浅谈cache memory》这本书不仅涵盖了缓存的基础知识,还深入探讨了缓存的一致性、层次结构以及数据预读策略,为读者提供了全面的缓存内存知识框架。缓存在现代计算系统中扮演着至关重要的角色,理解和掌握其工作...

    大规模电力系统状态估计浅谈.pdf

    总之,《大规模电力系统状态估计浅谈》这篇文章为我们提供了电力系统状态估计技术的新视角。它详细探讨了PMU和WAMS在提升大规模电力系统状态估计精度和系统可观测性方面的显著贡献,并指出了这些技术集成到现有SCADA...

    浅谈海上油田孤岛电力系统状态估计的必要性.pdf

    状态估计在海上油田孤岛电力系统中的应用与必要性 海上油田孤岛电力系统的状态估计是一种先进的电力系统管理技术,其主要目标是通过利用SCADA系统提供的量测数据,结合电网的拓扑结构和设备参数,计算出电力系统的...

    浅谈如何掌握学生心理状态.doc

    【标题】:“浅谈如何掌握学生心理状态” 【描述】:该文档主要探讨了如何理解和掌握学生心理状态,包括观察、分析和心理测量三个关键方面,旨在帮助教师更好地理解学生的行为背后的心理动因。 【标签】:“文档”...

    浅谈电力设备状态检修.pdf

    指出了电力设备开展状态检修的必要性, 介绍了国网开展状态检修的进展和开展状态检修需要注意的问题。对目前 状态检修工作中存在的问题进行了分析, 给出了开展状态检修的几点意见。

    浅谈电力系统状态检修的技术和管理.pdf

    综上所述,电力系统状态检修技术是一种全面的现代化设备管理方法,它通过实施状态检测、评估和优化决策,实现了设备维护的精确性和高效性。尽管实施状态检修需要一定的技术投资和管理变革,但其所带来的长期效益将远...

    浅谈形体训练培养良好气质体态的重要性-论文.zip

    尤其在快节奏的现代生活中,良好的形体与气质不仅能够提升个人的外在形象,更能体现内在的健康状态和生活品质。这篇论文深入探讨了形体训练如何帮助人们培养出优秀的气质体态,以及其对个人身心健康、社交互动、职业...

    浅谈提高离心泵的可靠性.rar

    以下是对"浅谈提高离心泵的可靠性"这一主题的详细探讨。 一、离心泵的工作原理与组成部分 离心泵主要由电机、泵壳、叶轮、轴、密封装置等部分组成。工作时,电机驱动叶轮旋转,流体在叶轮离心力的作用下获得能量,...

    浅谈面向对象程序设计

    相比之下,面向对象编程将数据和操作封装在一起,形成对象,从而增强了代码的稳定性和可重用性。此外,面向对象的设计还引入了类的概念,类作为一种模板,定义了一组对象的公共属性和行为,支持代码的重用和维护。 ...

    知乎:浅谈基于COMSOL的锂离子电池仿真.pdf

    锂离子电池是当前动力电池的最佳选择,其优点在于工作电压高、能量密度高、循环寿命长、无记忆效应,但是它也存在一些缺点,如能量密度进一步提升困难,容易产生安全问题,并且充电时间长,低温充电性能不好,造价...

    浅谈电力系统无功功率补偿.pdf

    "浅谈电力系统无功功率补偿" 摘要:本文讨论了电力系统中的无功功率补偿问题,分析了影响功率因数的主要因素,如变压器轻负荷运行、大量电感性设备、供电电压超出规定范围等,并提出了无功补偿的原则和方法。 ...

    html+css浅谈

    过渡和动画让元素在状态变化时有平滑的视觉效果。CSS变量则允许我们在一处定义样式值,在多处复用,提高了代码的可维护性和一致性。 通过这三个部分的学习,你可以掌握创建动态、响应式的网页所需的基本技能,并...

    GMP状态标识之浅谈[定义].pdf

    《GMP状态标识之浅谈》的文档详细阐述了在药品生产过程中,为了确保产品质量,遵循GMP(Good Manufacturing Practice)规范所实施的状态标识管理。这些标识主要用于防止混淆、差错、污染和交叉污染,涉及的领域包括...

    浅谈用户体验与界面设计

    ### 浅谈用户体验与界面设计 #### 一、以用户为中心的设计原则 用户体验设计的核心是“以用户为中心”(User-Centered Design, UCD),它强调从用户的需求和感受出发来设计产品。这一原则下的设计理念主要包括以下...

    浅谈信息学中状态的合理设计与应用1

    状态设计是指在信息学中,对于问题的状态进行分析和设计,以提高问题的解决效率和准确性。状态设计涉及到状态的定义、状态的表示、状态的转换和状态的优化等方面。状态设计的好坏直接影响到问题的解决效果,因此状态...

    浅谈电力系统变压器状态检修管理分析.pdf

    它能有效地将维护工作由时间驱动转变为状态驱动,避免了传统检修方式中的不确定性和资源浪费。在状态检修的核心流程中,数据收集是起点,涵盖了在线和离线两种监测手段。在线监测系统如绝缘在线监测、油色谱监测、...

Global site tag (gtag.js) - Google Analytics