[英]How can I get a browser cookie from the server in Meteor for session handling?
我目前正在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來斷開會話
我想在服務器上處理這個,因為我希望我的會話數據是私有的。 不得通過視圖呈現的會話數據(會話的唯一標識符除外)不得發送給客戶端。
如果我理解正確,你實際上並不關心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結構的腳本,並在大轉儲中執行一次。
所以流星大會是:
user.profile
字段中。 防爆。 user.profile.firstname
, user.profile.lastname
user
對象上。 user.roles
字段中。 以下是相關文檔: http : //docs.meteor.com/#meteor_user
Meteor Accounts不會跟蹤匿名用戶,因此您需要自己跟蹤它們。 您可以使用各種方法來執行此操作,但核心是在客戶端代碼中將一些標識令牌存儲在客戶端代碼中(存入localStorage或cookie)。
如果您不需要在服務器上存儲特定於用戶的數據,並且只想更改客戶端的內容,例如用戶看到的內容,那么您可以從客戶端執行所有操作。
如果您需要在服務器上為匿名用戶存儲數據,那么您必須將識別令牌與每個Meteor方法調用或數據庫交互一起發送到服務器(實質上是PHP對SESSION cookie的作用)。 在服務器上,創建一個名為“anonymousData”的集合,該集合將包含匿名用戶的所有用戶特定信息,由id標記鍵入。 服務器端函數可以使用客戶端傳遞的id標記查詢該Collection,以檢索該用戶的特定於用戶的信息。
請記住,如果用戶清除其cookie或刪除localStorage,則數據將成為孤立狀態,因此某些最后使用的檢查很重要。
你必須解析標題。 在大氣中尋找一個名為ip
的包。 這聽起來比它聽起來更棘手。
你可以做的一件事是使用localStorage而不是使用cookie。
試試localStorage
localStorage.setItem("name", "value");
並獲得一個值:
localStorage.getItem("name");
Meteor已經使用localStorage來存儲用戶的登錄狀態和ID
Cookie信息被包含在與做了HTTP調用的響應對象的報頭部分Meteor.http.call()
使用從客戶端調用Meteor.call()
set-cookie
是一個包含從服務器發送的任何cookie的數組。 以下是其中一個結果的屏幕截圖:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.