如何从Meteor中的服务器获取浏览器cookie以进行会话处理?

时间:2013-11-10 02:55:58

标签: javascript session cookies meteor session-cookies

我目前正在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"];
}

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

  • 页面重新加载之间似乎没有持续存在(它会创建一个 每次重新加载的新鲜会话

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

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

3 个答案:

答案 0 :(得分:2)

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

与PHP的比较

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

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

与PHP的SESSION相当的粗略是Meteor Collection,它实际上比PHP的SESSION更持久,因为它被持久化到数据库。

用户特定数据

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

  1. 经过身份验证的用户
  2. 匿名用户
  3. 回复:#1 - 经过身份验证的用户

    正如@Tarang和@Cuberto所指出的那样,Meteor Accounts系统(例如accounts-password)具有内置用户特定数据的概念。它为您创建和管理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.firstnameuser.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标记查询该Collection,以检索该用户的特定于用户的信息。

    请记住,如果用户清除其Cookie或删除localStorage,则数据将成为孤立状态,因此某些最后使用的检查非常重要。

答案 1 :(得分:0)

你必须解析标题。在气氛中寻找名为ip的包裹。这听起来比它听起来更棘手。

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

尝试localStorage

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

并获得一个值:

localStorage.getItem("name");

Meteor已经使用localStorage存储用户的登录状态&amp; ID

答案 2 :(得分:0)

Cookie信息包含在使用Meteor.http.call()从客户端调用的Meteor.call()完成的HTTP调用的响应对象的headers部分中。 set-cookie是一个包含从服务器发送的任何cookie的数组。以下是其中一个结果的屏幕截图: