3

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

在应用程序中,使用了仅包含唯一标识符的会话 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"];
}

我不确定流星的 Session 是否是我正在寻找的主要是因为:

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

  • 必须有一种方法可以通过简单地删除浏览器 cookie 来断开会话

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

4

3 回答 3

2

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

与 PHP 的比较

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

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

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

用户特定数据

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

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

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

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

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包将用户角色存储在受限制的字段user.roles中。

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

回复:#2 - 匿名用户

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

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

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

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

于 2013-11-11T21:09:44.223 回答
0

您将不得不解析标题。寻找一个叫做ip大气的包。这比听起来更棘手。

您可以做的一件事是不使用 cookie 的 use localStorage。

尝试本地存储

localStorage.setItem("name", "value");

并获得一个值:

localStorage.getItem("name");

Meteor 已经使用 localStorage 来存储用户的登录状态和 ID

于 2013-11-10T03:12:10.707 回答
0

cookie 信息包含在 HTTP 调用的响应对象的标头部分中,该对象Meteor.http.call()使用Meteor.call(). set-cookie是一个包含从服务器发送过来的所有 cookie 的数组。这是其中一个结果的屏幕截图:

于 2015-03-11T13:13:46.107 回答