javascript - 我如何从 Meteor 中的服务器获取浏览器 cookie 以进行 session 处理?

标签 javascript session cookies meteor session-cookies

我目前正在用 Meteor 重写一个 PHP+Mongodb 应用程序。

在应用程序中,使用仅包含唯一标识符的 session cookie。服务器获取浏览器的 cookie 并使用其值从集合中加载数据。这对于了解客户端的当前状态很有用。使用 Meteor 我需要能够从服务器代码中获取浏览器 cookie 的值。我怎样才能做到这一点?

在 PHP 中,可以这样做:

if(isset($_COOKIE["cookie_name"])) {
    //there is a browser cookie set with a name "cookie_name", 
    //and now I can act on that cookie's value, straight from the server
    echo $_COOKIE["cookie_name"];
}

我不确定 meteor 的 Session 是否是我要找的主要是因为:

  • 它似乎不会在页面重新加载之间持续存在(它会创建一个 每次重新加载新 session )

  • 必须有一种方法可以简单地断开 session 删除浏览器 cookie

我想在服务器上处理这个,因为我希望我的 session 数据是私有(private)的。绝不能将未通过 View 呈现的有关 session 的数据( session 的唯一标识符除外)发送给客户端。

最佳答案

如果我没理解错的话,您实际上并不关心 cookie,您关心的是拥有特定于用户的数据。

与 PHP 的比较

Meteor 客户端通过 DDP 与服务器通信,DDP 是 http 之上的抽象。 DDP 级别不存在诸如“cookie”之类的东西。相反,您可以访问强大的结构,例如同步的数据库集合和内置的远程过程调用。

Meteor 的Session 对象是一个专为 react 性而设计的仅限客户端的概念。它不会在客户端访问之间持续存在,并且服务器无法访问它。

与 PHP 的 SESSION 大致相当的是一个 Meteor Collection,它实际上比 PHP 的 SESSION 更持久,因为它被持久化到数据库中。

用户特定数据

在 Meteor 中跟踪用户特定的数据可以分为两部分:

  1. 经过身份验证的用户
  2. 匿名用户

回复:#1 - 经过身份验证的用户

正如@Tarang 和@Cuberto 所指出的,Meteor 账户系统(例如账户密码)内置了用户特定数据的概念。它为您创建和管理 Meteor.users 集合,并提供 Meteor.user() 函数来获取特定于该用户的对象。它甚至为用户对象的 profile 字段中的用户可修改数据提供了一个内置方法。 profile 字段是自动发布的,也是响应式(Reactive)的(因为 Meteor.user() 是响应式(Reactive)的)。

function doSomething () {
  var currentUser = Meteor.user(),
      profile;

  if (!currentUser) {
    // handle 'not authenticated' case
  } else {
    // already logged in
    profile = currentUser.profile || {name:'<not set>'};
    console.log('user ', profile.name, ' wants to doSomething');
  }
}

您可以构建自己的身份验证方法,但这似乎是灾难的根源。更容易编写一个脚本,将您现有的数据库结构转换为 Meteor Accounts 结构,并在准备好迁移用户时在大转储中执行一次。

所以 Meteor 约定是:

  • 用户应该能够修改的用户特定数据位于 user.profile 字段中。 前任。 user.profile.firstname, user.profile.lastname
  • 受限的用户特定数据应该放在根 user 对象上。
    前任。 meteor-roles包将用户 Angular 色存储在受限的 user.roles 字段中。

以下是相关文档:http://docs.meteor.com/#meteor_user

回复:#2 - 匿名用户

Meteor Accounts 不跟踪匿名用户,因此您需要自己跟踪他们。您可以使用各种方法来执行此操作,但核心是在客户端机器上的客户端代码中存储一些标识 token (存储到 localStorage 或 cookie 中)。

如果您不需要在服务器上存储特定于用户的数据,而只想更改客户端的内容,例如用户看到的内容,那么您可以在客户端执行所有操作。

如果您需要在服务器上为匿名用户存储数据,那么您必须将识别 token 连同每个 Meteor 方法调用或数据库交互(本质上是 PHP 使用 SESSION cookie 所做的)发送到服务器。在服务器上,创建一个名为“anonymousData”的集合,它将包含匿名用户的所有用户特定信息,由 id token 键入。服务器端函数可以使用客户端传递的 id token 查询该集合,以检索该用户的特定于用户的信息。

请记住,如果用户清除他们的 cookie 或删除 localStorage,该数据将被孤立,因此某种最后使用的检查很重要。

关于javascript - 我如何从 Meteor 中的服务器获取浏览器 cookie 以进行 session 处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19885763/

相关文章:

python - 如何通过域 django 传输 session 变量?

Python FileCookieJar.save() 问题

asp.net - 触发 OWIN cookie 中间件设置为被动身份验证模式的正确方法是什么?

javascript - 在 Javascript 事件监听器中包含 CSS 媒体查询

javascript - Angular.js API 调用 - 我应该使用工厂吗?

php - 在 PHP session 中存储用户密码是否常见?

iphone - 如何在 iPhone 应用程序中保持 Web 服务器的登录状态?

caching - 如何强制清除用户的缓存/cookie?

javascript - 在 node.js (node-soap) 中向 SOAP 消息添加属性

javascript用于更改html页面中链接的href