`
jbf034
  • 浏览: 152361 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多
Rails 的“会话”是个类似哈希表的结构,它在请求期间会一直有效。不像原始的cookie,
“会话”可以持有任何对象(只要这些对象可以被marshale),来保存web 应用程序内的状态信息。例如,在我们的store 应用程序中,我们使用了一个“会话”在请求之间持有购物车对象。此购物车对象在我们的应用程序中使用起来应该像其它对象一样。但是Rails 安排在每个请求处理的尾部保存购物车,更重要的是,在Rails 启动来处理一个引入的请求时,适当的购物车会被重新存储。使用会话,我可以让我们应用程序逗留在请求之间。

此处有两个部分。首先,Rails 必须保持“会话”的引用。它通过创建(缺省地)一个32hex
的字符key 键来做此事。这个key 键被称为“会话”id,并且它是随机数。Rails 在用户的浏览器上安排存储这个“会话”id 为一个cookie(带有key_session_id)。随后来自于这个浏览器的对应用程序的请求,Rails 可以重新获得“会话”id。
Rails 在服务端保持一个持久的“会话”数据仓库,可通过“会话”id 来索引。这有两
个“会话”魔术。当一个请求到达时,Rails 使用“会话”id 来查看数据仓库。它会发现此数据是个序列化的Ruby 对象。它反序列化此数据并将结果存储在“控制器”的session 属性中。此处数据对我们应用程序代码是有效的。应用程序可以添加或修改这个数据的内容。当它完成对每个请求的处理后,Rails 把“会话”数据写回到数据仓库中。并在那里等待这个浏览器的随后请求。
我们应该在“会话”内存储什么呢?你需要的任何东西,只要遵循少数的约束和警告。

session对象存储内容的限制

1、在一个“会话”中对你能存储一些种类的对象有约束。细节依赖于你所选择的存储机
制。(稍后我们就会看到)在通常情况下,“会话”内对象必须是被序列化的(使用Ruby 的“重组”(Marshal)功能)。例如,这意味着你不能在“会话”中存储I/O 对象。

2、如果你在“会话”中存储任何Rails“模型”,你将必须添加“模型”的声明给它们。
这会让Rails 预先加载“模型”类,以便它的定义在Ruby 反序列化“会话”仓库时是有效的。如果“会话”被限制为只用于一个“控制器”,则它的声明可放在那个“控制器”的顶部。
class BlogController < ApplicationController
model :user_preferences
# . . .
可是,如果较多的model类对象要声明,这时可以直接声明给app/controllers 目录下全局的application_controller.rb 文件。

3、不要在“会话”数据中存储大的对象—而把它们放到数据库内,并从“会话”
中引用它们。

4、不要在session对象中存储易失性数据,你或许不想在“会话”数据内存储valatile(暂态)对象。例如,你可能想保持博客内一定数量的文章,并且出于性能的原因把它们存储在“会话”中。但是,如果你这样做的话,在其它用户添加了新文章的话,计数不会得到更新。
将表现当前登录用户的对象存储在“会话”中是很诱人。但是如果你的应用程序可以由
非法用户使用,这就可能不是你希望的了。即使数据库内的用户无效,它们的“会话”数据
将仍有有效状态。在数据库内存储volatile(暂态)数据并从“会话”中引用它。

5、你或许不想在“会话”数据中存储重要信息。例如,如果你的应用程序在一个请求中
产生一个定单信息号,并且存储它在“会话”数据中以便于在处理下个请求时将它存回到数
据库中。如果用户从它的浏览器中删除了cookie,你就要冒丢失号码的危险。重要信息应该
保存在数据库中。这是个很大的漏洞。如果你在“会话”数据中存储一个对象,然后下一次你从你的应用程序的浏览器中重新取回那个对象。但是,如果在此期间你更新了你的应用程序,那么“会话”数据内的对象可能就会与你的应用程序内该对象的类的定义不一致。

则应用程序在处理这个请求时会失败。此处有三种选择。
一是使用常规的“模型”存储对象在数据库中,并只在“会话”中保持行的id 字段。“模型”对象对Ruby 的Marshal 库的改变是最宽容的。

第二种选择是在你修改用于存储数据的类的定义时,在你的服务端手工删除所有的“会话”数据。

第三种选择稍微有些复杂。如果你给你的“会话”的key 键添加一个版本号的话,那么
你更新被存储的数据时会修改版本号,你将只加载与应用程序的当前版本号相应的数据。你
可以为存储在“会话”内的对象使用潜在的版本,并依赖与每次请求关联的“会话”key 键
来使用适当的类。最后的选择需要大量的工作,所以你将需要决定它是否值得。

因为“会话”以类似哈希表的形式被存储,所以你可以在其中保存多个对象,每个都带
有它自己的key 键。下面代码中,我们存储登录用户的id 在“会话”中。并在后面创建的
index“动作”中使用它。
为用户定制个菜单。我们也记录最后被选择的菜单条目的id,并在index 页面中使用id
来选择。当我们使用日志时,我们会重置所有“会话”数据。
class SessionController < ApplicationController
def login
user = User.find_by_name_and_password(params[:user],
params[:password])
if user
session[:user_id] = user.id
redirect_to :action => "index"
else
reset_session
flash[:note] = "Invalid user name/password"
end
end
def index
@menu = create_menu_for(session[:user_id])
@menu.highlight(session[:last_selection])
end
def select_item
@item = Item.find(params[:id])
session[:last_selection] = params[:id]
end
def logout
reset_session
end
end

像通常的Rails 习惯,缺省的“会话”很方便,但如果需要我们可以覆写它。这种情况
下,“会话”的选项是全局的,所以你典型地会在你的环境文件中
(config/environment.rb或config/environments 目录下的一个文件)设置它们。[此处有个例外—你不能以这种方式设置“会话”失效时间。]这不是API 式的设置选项:你只是简单地直接设置值到DEFAULT_SESSION_OPTIONS 哈希表中。例如,如果你想修改你应用程序使用的cookie 的名字,
你会在环境文件中添加下面东西。
ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS
[:session_key] = 'my_app'

有效的“会话”选项是:
1、:database_manager 控制“会话”数据如何被存储到服务端。
2、:session_domain 用于在浏览器上存储“会话”id 的cookie 域。缺省是应用程序的
主机名字。
3、:session_id 覆写缺省的“会话”id。如果没有设置,新的“会话”将自动具有32
位的key 键。此key 键被用于随后的请求中。
4、:session_key 用于存储“会话”id 的cookie 的名字。你将在你的应用程序中覆写
它,就像前面显示的。
5、:session_path 应用于这个“会话”的请求路径。缺省值是“/”,所以它应用于这
个区域内的所有应用程序。
6、:session_secure 如果设置的话,“会话”将只对https://有效。缺省值为false。
7、:new_session 直接映射底层的cookie 的new_session 操作。但是,这个选项在Rails
下不会像你想像那样工作,我们在323 页16.8 节讨论另一个选择。
8、:session_expires 此“会话”失效的绝对时间。像:new_session,这个选项或许不
应该在Rails 下使用。
另外,你可以指定依赖于存储类型的选项。例如,如果你选择使用Pstore 数据管理“会
话”数据,你可以控制Rails 存储文件的位置,以及预先确定各个文件的名字。
class DaveController < ApplicationController
session_options
= ::ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS
session_options[:tmpdir] = "/Users/dave/tmp"
session_options[:prefix] = "myapp_session_"
# ...
这些细节可查看CGI::Session 的标准Ruby 文
分享到:
评论

相关推荐

    Python 神经网络 07会话Session.mp4

    Python 神经网络 07会话Session.mp4

    session会话管理

    Session 会话管理 Session 会话管理是指在 Web 应用程序中管理用户会话的机制。Session 是一种服务器端的存储机制,用于存储用户的会话信息。Session 管理包括 Session 的创建、读取、更新和删除等操作。 Session ...

    如何使用Redis保存用户会话Session详解

    如何使用Redis保存用户会话Session详解 在高并发的Web应用中,PHP默认的会话存储机制——将Session数据保存在服务器本地的文件中,可能会成为性能瓶颈。为了解决这个问题,我们可以利用Redis这种高性能的键值存储...

    如何安全快速的批量删除Oracle数据库外部会话session

    总结来说,安全快速地批量删除Oracle数据库外部会话涉及到对`ALTER SYSTEM KILL SESSION`、`ALTER SYSTEM DISCONNECT SESSION`命令的熟练运用,以及可能的与操作系统交互。在执行这些操作时,务必小心谨慎,避免对...

    H3C防火墙会话详细说明

    本文详细介绍了H3C防火墙会话建立转发过程。包括tcp/udp/icmp/rawip等。通过本资源,你会对防火墙有更深层次的理解。

    asp.net简单会话(session)应用

    ASP.NET中的会话(Session)是Web开发中一个重要的概念,它允许开发者在用户的不同页面请求之间保持数据。本文将详细讲解ASP.NET中会话的应用,帮助你理解其工作机制。 一、什么是会话(Session)? 在Web应用程序...

    php利用session_start查看浏览记录

    在PHP编程中,`session_start()` 是一个非常关键的函数,它用于启动一个新的会话或者恢复当前页面上已经存在的会话。会话是Web应用程序中用于跟踪用户状态的一种方法,尤其是在用户浏览过程中需要保存信息的情况下,...

    session.js, Session.js 获取用户会话信息.zip

    session.js, Session.js 获取用户会话信息 Session.js提供有关当前会话的信息。要使用:包括文件 session.js, 然后访问访问者对象。 它使用google加载器获取位置数据。 对于异步加载,请使用 window.session_loaded ...

    shiro的session中的会话管理

    在分布式系统或微服务架构中,会话管理成为一个关键问题,因为默认情况下,Shiro的session管理是基于单个服务器的,无法在多台服务器之间共享用户会话信息。 在传统的Web应用中,session信息通常存储在服务器的内存...

    PHP Cookie:Session详解.md

    - `session_start()`: 启动一个新的会话或者恢复现有的会话。 - `$_SESSION`: 这是一个超全局数组,用于存储和访问会话数据。 - `session_destroy()`: 销毁当前会话中的所有会话数据。 - `session_unset()...

    nginx+tomcat7+memcached session会话保持

    在Tomcat中,我们可以使用第三方库如`memcached-session-manager`来实现会话到Memcached的迁移。在Tomcat的`lib`目录下添加该库的jar包,比如`tomee-memcached-session-manager-x.x.x.jar`,并配置`context.xml`: ...

    session.socket.io, 在 socket.io 中,表示/连接会话.zip

    session.socket.io, 在 socket.io 中,表示/连接会话 session.socket.io ( SessionSockets ) 这个小模块简化了 socket.io 使用express或者连接中间件的http会话的使用。 它没有依赖项,可以使用任何与表示或者连接...

    Session详解

    Session,中文常译为“会话”,在Web开发领域中扮演着至关重要的角色,尤其是在维护客户端与服务器之间的交互状态方面。Session的概念源远流长,但其核心在于“保持状态”,即确保在一系列操作或消息传递过程中,...

    spring session实现分布式会话管理

    Spring Session 是一个开源项目,由 Pivotal 团队维护,它旨在提供一种在分布式环境中管理用户会话的解决方案。Spring Session 的核心理念是将传统的 HTTP Session 数据存储和管理从应用服务器迁移到更灵活、可扩展...

    httpclient如何保持session会话模拟登录后的操作

    本篇文章将深入探讨如何使用HTTPClient来实现session会话的保持,并在模拟登录后执行后续的操作。 首先,了解HTTP协议的基础知识是非常重要的。HTTP协议是无状态的,这意味着每次请求之间没有任何关联。为了保持...

    TensorFlow学习笔记1——Session会话控制

    一个TensorFlow图描述了计算的过程,为了进行计算,图必须在会话Session里启动。Session拥有和管理物理资源CPU和GPU、网络连接的功能,作为上下文管理器来使用 1.建立Seesion会话 现在定义计算矩阵相乘的一个操作 ...

    PHP小型项目(session机制、mysql连接)

    当用户登录成功后,我们设置特定的会话变量(如`$_SESSION['loggedin']`)。然后,我们可以在其他页面检查这些变量,以确定用户是否已登录。例如: ```php session_start(); if(!isset($_SESSION['loggedin']) || ...

    PHP会话控制SESSION与COOKIE

    当用户访问网站时,服务器为该用户创建一个唯一的会话ID(session_id),并将其存储在服务器的内存中。这个ID通过COOKIE发送给用户的浏览器,之后浏览器在每次请求时都会带上这个ID,使得服务器能够识别并跟踪特定...

    Activemq原理文档

    4. 使用会话Session和管理对象Destination创建消息生产者MessageSender 5. 使用消息生产者MessageSender发送消息 消息接收者的步骤: 1. 创建连接使用的工厂类JMS ConnectionFactory 2. 使用管理对象JMS ...

Global site tag (gtag.js) - Google Analytics