簡體   English   中英

如何從Meteor中的服務器獲取瀏覽器cookie以進行會話處理?

[英]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,你關心擁有特定於用戶的數據。

與PHP的比較

Meteor客戶端通過DDP與服務器進行通信,DDP是http之上的抽象。 DDP級別中不存在“cookies”之類的內容。 相反,您可以訪問強大的構造,如同步數據庫集合和內置遠程過程調用。

Meteor的Session對象是一個僅用於客戶端的概念,專為反應性而設計。 它不會在客戶端訪問之間持久存在,並且服務器無權訪問它。

與PHP的SESSION相當的粗略是Meteor Collection,它實際上比PHP的SESSION更持久,因為它持久存儲到數據庫中。

用戶特定數據

跟蹤Meteor中您想要的特定用戶數據可以分為兩部分:

  1. 經過身份驗證的用
  2. 匿名用戶

回復:#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結構的腳本,並在大轉儲中執行一次。

所以流星大會是:

  • 用戶應該能夠修改的用戶特定數據位於user.profile字段中。 防爆。 user.profile.firstnameuser.profile.lastname
  • 受限制的用戶特定數據應該位於root 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,則數據將成為孤立狀態,因此某些最后使用的檢查很重要。

你必須解析標題。 在大氣中尋找一個名為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM