在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/C  數(shù)據(jù)庫  HTML/ node + express限制用戶異地/多處登陸問題方案

node + express限制用戶異地/多處登陸問題方案

后端:Node + Express框架
前端:Vue框架

實現(xiàn)功能:
限制同一用戶在不同瀏覽器登陸,解釋如下:
例如用戶A在PcA處以用戶名user進(jìn)行了登陸,用戶B在PcB處以用戶名user進(jìn)行登陸時,瀏覽器提示用戶”user已在另一處登陸,是否踢其下線?”
此時,用戶B選擇是,則用戶A提示下線,用戶B上線

當(dāng)前方案:
利用express-session:用戶A登陸后,用戶名和密碼保存于session和cookie中(session做永久化處理,存儲于mongo數(shù)據(jù)庫中),用戶B登陸時在數(shù)據(jù)庫中查詢是否有user用戶,如果有則返回是否踢用戶A下線的提示,用戶B選擇是,則后端主動過期用戶A的cookie

我的問題:

  1. 限制同一用戶在不同瀏覽器登陸的功能,利用session這個方案是否合理?
  2. 我理解每個瀏覽器向后端發(fā)送請求后,都會形成相應(yīng)的session保存起來,查詢session數(shù)據(jù)一般是怎樣實現(xiàn)的?例如,怎樣查詢包含”user“的session的”id“
  3. 怎樣實現(xiàn)后端主動向前端發(fā)起請求?比如用戶A未向后端發(fā)起請求的情況下,后端直接修改用戶A的cookie,使之過期?
  4. 如果方案不合理,還請指點,感謝!
回答
編輯回答
練命

樓主的問題

  1. 限制同一用戶在不同瀏覽器登陸的功能,利用session這個方案是否合理?-- 合理
  2. 我理解每個瀏覽器向后端發(fā)送請求后,都會形成相應(yīng)的session保存起來,查詢session數(shù)據(jù)一般是怎樣實現(xiàn)的?例如,怎樣查詢包含”user“的session的”id“ -- 這個是session store的實現(xiàn)細(xì)節(jié),不同的store不一樣,一般是存在數(shù)據(jù)庫里(mysql、mongo、redis等)。session id是可以自定義的,只要能跟用戶名關(guān)聯(lián)起來就行
  3. 怎樣實現(xiàn)后端主動向前端發(fā)起請求?比如用戶A未向后端發(fā)起請求的情況下,后端直接修改用戶A的cookie,使之過期? -- 這里在服務(wù)端清除session即可,有官方的api store.destroy(sid, callback)。

怎么限制同個用戶不能多個地方同時登錄

實現(xiàn)思路樓主應(yīng)該是有的,只是實現(xiàn)細(xì)節(jié)不清楚:

  1. 用戶登錄,存儲session。每個用戶的session對應(yīng)一個id,假設(shè)就是用戶名。
  2. 用戶再次登錄,檢測當(dāng)前用戶是否已經(jīng)登錄 -> 檢測該用戶名,是否已經(jīng)存在session。

樓主不清除的應(yīng)該是,怎么把 用戶名、session id關(guān)聯(lián)起來,包括怎么在有用戶名的情況下,查詢到該用戶名對應(yīng)的session。

如果用express-session,可以這么實現(xiàn)。

genid選項:生成session id

genid返回的是session對應(yīng)的id,樓主根據(jù)實際情況進(jìn)行自定義。

app.use(session({
  genid: function (req) {
    return req.query.usrname; // 生成session的id
  }
}));

session檢測

用戶再次登錄,通過session id 去檢測session是否存在,以此判斷用戶是否已登錄。

app.use(function (req, res, next) {
  req.sessionStore.get(req.query.usrname, function (error, session) {
    // 如果session存在,表示用戶已在其他地方登錄
  });
});
2018年1月9日 15:52