这是一个老问题了, 也是做web开发必须要弄明白的, 其实是很简单的东西, 想想上学时被它搞得迷糊就觉得好笑!上班后做了开发, 渐渐明白, 共享一下, 希望对大家有所帮助!
一 先说说http吧, 这个是web的根本大法
HTTP协议本身是无状态的,客户端只需要简单的向服务器请求,如:www.google.com/abc.html.服务器将文件内容返回给客户。无论是客户端还是服务器都没有必要纪录彼此过去的行为。然而人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用,如www.google.com/search=美女。这种需求一方面迫使 HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范以响应客户端的动态请求。 后来用户对WEB有了更高的要求, 如购物, 一个网络商店每天处理N个客户请求,当接到一个请求时,就需要知道这个客户在站点订了几个商品,有没有付款等。为此HTTP协议添加了cookie特性。cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。
引用网上朋友的用例(忘记URL了,不好意思):
让我们用几个例子来描述一下cookie和session机制之间的区别与联系。X曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:
1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。
3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。
由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie来达到保存标识的目的,但实际上它还有其他选择。注意session并不HTTP的内容,它是保存客户端状态的一种机制。
二 理解cookie
cookie简单来说就是服务器设置一些信息,将它存储在客户端, 就像上面的例子2。(客户端脚本如JavaScript或者VBScript也可以生成cookie,但是目的都是为了存储信息),当客户再次访问服务器时, 浏览器会带上cookies发送请求给服务器。浏览器处理cookies的是有规则的,只发送附和条件的cookies. 意思是,当访问麦当劳时,只需出示麦当劳的会员卡。
三 理解session
session其实更简单, 就像例子3,在客户端只有一个卡号,他每回来的时候,一出示卡号,服务器会查找当前卡号的信息,就知道他的状态了。它的实现可以用cookies,也可以用其它方法,如:作为查询字符串附加在URL后面。
在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。
相关推荐
相比第2版中的内容,Rails 2增加了REST、资源、轻量级web service等新特性。本书涵盖了这些全新的内容,因此能更好地体现出Rails框架的发展现状。 整体而言,全书既有直观的实例,又有深入的分析,同时还涵盖了web...
Rails工作流引擎概述Rails Workflow允许您通过在流程中加入用户操作和自动操作来组织应用... 每个操作都在其自己的事务中运行,并具有单独的上下文。 流程可能会被取消,手动更改,回滚,重置为任何特定操作。 允许跟踪
TransactApp-Ruby on Rails Web应用程序 TransactApp允许用户创建一个帐户并登录以对提交的任何交易进行分组 目录 关于该项目 Ruby on Rails移动应用程序允许用户注册,登录,创建交易并将它们分组 现场演示 怎么跑...
具有共享事务ID的Instrument Rails和Resque可以跨应用程序和应用程序实例跟踪工作单元的执行。 如果您正在使用类的系统来管理许多应用程序和应用程序实例中的日志文件,这将特别方便。 安装 将log_weasel添加到您的...
重定向ActiveRecord(Rails)读取到副本数据库,同时确保所有写入都转到主数据库。 状态 这是Rocket Job原始库的略微修改,只是将其从active_record_slave重命名为active_record_replica 。 为了更清楚地将库与...
它可以与Ruby on Rails一起使用。 如果您有一个独立的基于ActiveRecord的项目,则需要调用: TransactionRetry.apply_activerecord_patch # after connecting to the database 连接到数据库后。 重试的数据库死锁...
应该模仿与Ruby on Rails中的相同的功能。 如果要侦听事务中模型触发的事件,并且要确保事务成功完成(或回滚),则要使用此方法。 安装 您可以通过composer安装该软件包: composer require mvanduijker/laravel...
它在单个事务中提供了依赖记录的嵌套创建。 它可以处理存储在列中的媒体数据,例如图片或 pdf 文档。 它处理 Rails 模型提供的所有关系: 属于有很多has_and_belongs_to_many 数据浏览:您可以快速浏览关系快速开始...
度量标准和事务跟踪将报告给托管应用程序监视服务 。 有什么特别的酱料? :thinking_face: 侦察员代理经过精心设计,可以做一些出色的事情: 唯一的重点是识别那些难以调查的异常值,例如内存膨胀,N + 1和特定于...
Accio Transactios 跟踪您借方帐户的贷方和借方的...设置Rails支架用于设置ActiveRecord。如何使用您可以通过单击链接来跟踪它们。 您可以通过完全填写并提交表单来创建事务处理。 您可以创建,编辑和删除事务处理。
1.17 2 Spring2.0用注解实现事务管理 1.18 Struts2教程2:处理一个form多个submit 2. Ruby 2.1 Ruby on Rails环境下工作流的实现 2.2 让Ruby On Rails走进企业开发 2.3 让Ruby On Rails走进嵌入式开发2.4 用Ruby...
如果启用了唯一性验证,Rails将在执行Model.create , Model.save , Model.update ...操作之前查找现有记录。 如果找到记录,则验证失败,并且事务将回滚,否则记录将被保存。 例如,您具有facebook_id字段的用户...
税务Rails应用程序可帮助您跟踪您的活动和每项活动的费用而没有任何复杂性。目录特征用户只需输入用户名即可登录到应用程序。 个人资料页面包含以下链接: “我的任务”。 “其他任务”。 “组”。 “登出”。 我的...
GaleraClusterMigrations GaleraClusterMigrations 有助于缓解使用执行 Rails 数据库迁移的一些问题。 Galera Cluster 提供了两个选项来执行 DDL(数据定义语言)语句:Total Order Isolation(TOI)和 Rolling ...
#Redis 与 Ruby / Rails一些基本命令命令概述将成员添加到存储在 key 的集合中。 如果 member 已经是该集合的成员,则不执行任何操作。 如果 key 不存在,则创建一个新集合,将 member 作为其唯一成员。 从存储在 ...
这是我的Salvador Olvera的Ruby on Rails Capstone Microverse项目。 该项目以375 x 812像素的分辨率构建。 现场演示 它能做什么 用户注册登录到该应用程序。 向用户显示一个配置文件页面,该页面包含指向我的费用...
Ruby on Rails 通过将每个测试包装在一个事务中(BEGIN ... ROLLBACK)在一定程度上解决了这个问题。 它速度非常快,而且工作得非常好,但它之所以有效,是因为 Rails 测试全部在一个进程中运行,并具有一个数据库...
2. 采用工作单元来组织数据模型,提供级联查询,延时加载,N+1=>1+1,短事务,全局唯一ID和Identity Map等特性,能有效防止数据库死锁的发生。 3. ConnectionManager管理工作单元内的数据库链接,支持跨库提交,跨库...
这种方法的好处是可以将作业发布为修改应用程序记录系统的事务的一部分。 即使Sidekiq / Redis暂时不可用,它也允许创建作业。 单独的发布者流程将处理重试,并确保将每个作业交付给Sidekiq。 安装 将此行添加到您...