我目前正在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
我想在服务器上处理这个问题,因为我希望我的会话数据是私有的。关于未通过视图呈现的会话的数据(会话的唯一标识符除外)绝不能发送给客户端。
答案 0 :(得分:2)
如果我理解正确,你实际上并不关心cookie,你关心拥有特定于用户的数据。
Meteor客户端通过DDP与服务器进行通信,DDP是http之上的抽象。 DDP级别中不存在“cookies”之类的内容。相反,您可以访问强大的构造,如同步数据库集合和内置远程过程调用。
Meteor的Session
对象是一个仅限客户端的概念,专为反应性而设计。它不会在客户端访问之间持久存在,并且服务器无权访问它。
与PHP的SESSION相当的粗略是Meteor Collection,它实际上比PHP的SESSION更持久,因为它被持久化到数据库。
跟踪Meteor中您想要的特定用户数据可以分为两部分:
正如@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.firstname
,user.profile.lastname
user
对象上
防爆。 meteor-roles包将用户角色存储在受限制的user.roles
字段中。以下是相关文档:http://docs.meteor.com/#meteor_user
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的数组。以下是其中一个结果的屏幕截图: