这是一个老问题了, 也是做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删除以节省存储空间。
相关推荐
在添加或删除商品时,更新购物车模型,并确保事务处理正确,以防止数据不一致。 在视图层,使用ERB(Embedded Ruby)模板语言来渲染HTML,展示商品列表和购物车内容。可以创建一个购物车组件(partial),在多个...
2. **复杂的路由**:Rails的路由系统允许灵活地定义资源和URL结构。高级Rails会讲解如何创建更复杂的路由规则,如命名空间、嵌套资源和条件路由。 3. **ActiveRecord高级用法**:ActiveRecord是Rails的ORM(对象...
2. Rails 3.1: 这个版本引入了Asset Pipeline,它管理应用程序的CSS、JavaScript和其他静态资源,提高了加载速度并支持压缩和合并。另外,它还引入了CoffeeScript和Sass作为默认的JavaScript和CSS预处理器,提升了...
`,以及更强大的事务处理能力。 5. **ActiveResource**:这个组件用于构建RESTful客户端,连接到其他Web服务。虽然在后续版本中被逐渐废弃,但在Rails 3.2中仍然是可用的。 6. **ActionPack**:包含Action...
#### 第2章:入门指南 本章是针对不同操作系统(Windows、OS X 和 Linux)的安装指南,指导读者如何安装 Ruby、Rails 以及 SQLite 数据库。这一章节对于确保所有读者都在相同的技术平台上至关重要,为后续章节的...
- **事务回调**:讨论如何在数据库事务中使用回调。 #### ActiveRecord关联 - **为什么使用关联**:解释关联对于简化数据库查询和提高代码可读性的重要性。 - **关联的类型**:列举各种关联类型,包括一对一、一对...
在实际开发中,可能还需要处理诸如时间戳类型转换、字符编码、事务处理等其他问题。此外,SQLServer 2000的安全性和性能可能已经落后,因此升级到更现代的版本,如SQLServer 2012或更高版本,可能会带来更好的开发...
在 Rails 2.x 中,许多使用哈希参数的查询方法如 `:conditions`, `:include`, `:joins` 等在 Rails 3.1 中被标记为过时,虽然在3.1版本中仍然可用,但计划在 Rails 3.2 中完全移除。这些变化主要是为了引入一个新的...
订单状态的跟踪和管理是复杂部分,需要良好的数据库设计和事务处理以确保数据一致性。 5. 支付集成:与第三方支付平台如支付宝、微信支付的接口对接。Rails提供了OmniAuth等库进行身份验证,Stripe、PayPal等支付...
尽管InfluxDB本身不支持事务,但`lib/influxdb/rails/transaction.rb`文件通过模拟事务行为,确保在一组操作中的数据一致性。这在处理多个写入操作时尤为重要,可以避免因单个操作失败而导致的数据不一致。 最后,`...
2. **Rails框架核心概念**:包括路由(Routing)、控制器(Controllers)、模型(Models)、视图(Views)和ActiveRecord,这些都是Rails开发的核心组件。 3. **数据库交互**:Rails使用ActiveRecord作为ORM(对象...
2. **Gemfile与依赖管理**:Rails使用Bundler来管理项目依赖,Gemfile用于声明项目所需的Ruby gems。手册将解释如何配置Gemfile,以及如何安装和更新gem。 3. **ActiveRecord**:这是Rails的ORM(对象关系映射)库...
**13.2 迭代I2: Exploring Strategies for Content** 探索了不同类型的国际化策略,以更好地适应不同语言环境。 #### 十四、任务T: 测试 这部分介绍了如何为Depot应用编写测试用例。 **14.1 加上测试** 介绍了...
2. **Ruby on Rails 框架**:Rails是基于Ruby语言的MVC(模型-视图-控制器)框架,以其DRY(Don't Repeat Yourself)原则和生产力著称。它简化了Web开发,提供了丰富的库和工具。 3. **JDBC驱动**:由于Rails默认...
2. **Ruby on Rails与Active Record** - **集成方式**:在Rails中,Active Record是核心ORM(Object-Relational Mapping)组件,几乎所有的模型类都会继承自`ActiveRecord::Base`。 - **关联关系**:Active Record...