文章目录
cookie保存在客户端,session保存在服务器端。二者均用于描述会话的状态。服务器端可以创建多个cookie对象响应到客户端并保存在客户端;浏览器客户端在发送请求时自动携带对应请求路径下的所有cookie信息供服务器响应使用。服务器端也可以获取每个客户端对应的唯一的一个session对象,并取得该对象中的某些属性用来验证用户的非法操作,这里只是大概讲一下二者的地位。
比如,某sdn、某讯视频可以在用户第一次登陆时选择保存用户的登录信息,在某段时间内用户可以在进入该网页时直接实现自动登录的效果。极大地优化了用户的体验。这是因为有我们账户对应的cookie信息存储在本地硬盘,当我们操控客户端向对应的服务器发送请求时,会自动发送这个已经保存的cookie信息,服务器接收并且验证了这个信息才使的我们能够实现客观上“免登录”的效果。
浏览器为了电脑的安全性,禁止js代码访问本地磁盘的数据。而cookie机制为浏览器访问硬盘文件提供了手段,也就有了持久化存储一说。
例如,客户端在首次登录成功时,服务器创建了两个分别包含用户名和用户密码的cookie信息,并响应存储在了客户端的内存或者硬盘空间上。如果存储在内存中,那么就可以实现客户端在一次会话的过程中多次打开网站自动登录的效果;如果存储在硬盘空间并设置了生效时间,那么客户端在这段时间内都不论是否进行同一次会话都可以实现自动登录的效果。极大地优化了用户体验。如果一个常规网站在每次打开时都提示用户进行登录,这回是多么让客户抓狂的一件事!cookie的功能原理图如下,拿用户免登录来说:

只要是做web开发,不论是什么编程语言,cookie机制都是必不可少的。不论是客户端还是服务器,发送的cookie样式都是键值对形式,服务器获取到的name或者value都是字符串形式
Cookie cookie = new Cookie(String name,String value); //Cookie类只提供了这一种形式的构造方法
cookie.setMaxAge(int second); //设置cookie的生命周期的参数是以秒为单位的。
//例如,设置一个cookie的生命周期为10天,可以设置参数为60*60*24*10
cookie.setPath(String url); /*当服务器端将cookie对象相应保存到客户端时,当客户端发送在这里设置的请求
在这里设置的请求路径时,会自动将与该路径相关的所有cookie信息包含在请求体中发送给服务器
关于服务器端设置cookie对象的生命周期
- cookie.setMaxAge(second > 0):cookie对象存活second秒,客户端接收cookie对象后存储在本地磁盘上
- cookie.setMaxAge(second = 0):删除这个cookie对象
- cookie.setMaxAge(second < 0):存储这个cookie对象到浏览器内存上,在一次会话中生效,当浏览器窗口关闭后这个cookie也就失效了
response.addCookie(Cookie var);
Cookie cookies[] = request.getCookies(); //返回客户端发送的该路径下的所有cookie信息
关于服务端获取客户端发送的cookie信息
服务端通过请求对象的getCookies()获取客户端发送请求路径下对应的所有的cookie信息,返回的是一个cookie数组。如果没有获取到客户端的任何cookie信息,则返回null,并不会创建一个长度为0的cookie数组返回
一次会话对应一个session对象。多次会话对应多个session对象。在服务器端可以向这个session对象中添加属性,本次回话中所有的请求都会共享这个session对象


HttpSession session = request.getSession();
关于服务器端创建/获取session对象
服务器端通过HttpServletRequest对象的getSession对象创建/获取session对象。当用户第一次在会话中发送请求时, 给用户对应会话在服务器端并没有session对象,这是getSession()方法会为该用户创建一个session对象。当用户非第一次发送请求时,getSession方法会返回该用户对应的session对象。
session.setAttribute(String name,Object o); //向该会话的session对象中添加属性
Object o = session.getAttribute(String var);//获取该会话中session中的属性
session.removeAttribute(String var); //移除该会话对应session对象中的var属性及其value
session.invalidate();
三者都可以作为数据域共享的工具,那么有什么不同呢?
请求对象的生命周期很短,当一次请求结束后这次请求对象也就被销毁了,请求域中的数据也就不存在了,这种数据域的共享方式常用于不同请求转发之间
一个用户的一次会话对应一个session对象,这个session对象中添加的数据在这次会话中不论哪次请求都可以被共享。不同用户的会话对应不同的session,每一个session对象是被个体客户所关联的
向ServletContext对象中添加的共享数据域是整个项目,所有客户端所共享的
三者域的大小关系
三者的使用原则
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r