产品提了个奇葩需求,暂时没好的解决方案求助下大家。 官网:a.xxx.com ,控制台:a-admin.xxx.com 。需要在官网登录后控制台也保持登录状态(这块以前种 cookie 能实现),现在产品的需求是官网或控制台页面(都是 React 单页面,前提都是登录状态),关闭浏览器算退出登录,同时关闭官网和控制台 2 个 tab 也算退出登录,但是只要官网和控制台有一个 tab 在就算登录状态,有点麻了。。
1
MuscleOf2016 2023-01-31 19:16:00 +08:00
cookie + session ?
|
2
damngoto 2023-01-31 19:19:29 +08:00
我建议揍 TA 一顿
|
3
learningman 2023-01-31 19:31:28 +08:00 1
换 jwt 类似的带状态的 session ,每个页面都定期轮询确保 session 有效,一段时间没轮询就注销掉这个 session 。
这样只要有任意一个页面开着就能有效。 |
4
dusu 2023-01-31 19:48:58 +08:00 via iPhone
这不是正常需求么?
jwt 写到整个域名下 .xxx.com 前端做个心跳来维持 cookie |
5
klo424 2023-01-31 19:53:32 +08:00 1
需要后端配合吧。
前端 30s 一心跳维持 cookie ,后端接收心跳与前一次心跳比较,时差超过 1min 就告诉前端掉线。 |
6
soupu626 2023-01-31 20:00:30 +08:00 1
简单想的
后端 session 过期时间设置短一点,比如 10 秒,然后前端 3 秒心跳保活刷新过期时间? |
7
moxxun 2023-01-31 20:51:02 +08:00 via iPhone
试试 window.postMessage
|
8
KuroNekoFan 2023-01-31 20:53:37 +08:00
postMessage 加 sessionStorage 咯....
|
9
cpstar 2023-01-31 21:28:08 +08:00 1
除了被动轮询,这不太可能啊,两个 tab 直接不可能通信,一个 tab 关了它怎么知道还有别的 tab 在。
除非。。。 每次请求都刷新一次后台的 session ,每次关闭 tab 或者窗口(onunload)都向后台告知退出了。然后后台来判定这个上一次报告的退出和下一次的请求是否是曾经的某个同一次登录。如果两个域在不同的容器里,再互通一下有无吧。 |
10
gausszhou 2023-01-31 21:50:54 +08:00
> 同时关闭官网和控制台 2 个 tab 也算退出登录
这需求.... |
11
InoriLover 2023-01-31 22:14:38 +08:00 1
services worker
sw 来管凭据,tab 都关的话 sw 就没了 |
12
Lukedis 2023-01-31 22:30:06 +08:00 1
域名共享 token,后端 token+redis,tap 关闭告诉后端 tap 关闭,两个 tap 都是关闭状态,直接让 token 失效
|
13
wingkwanli888 2023-01-31 22:53:57 +08:00 via iPhone 1
Postmessage
情境一,先开了官网 Tab, 登录了官网后,用户再开一个新的 tab 打开控制台,控制台 tab 每次一刷新就 postmessage 问隔壁的官 tab 获取 token 情境二,同时打开两个 tab, 全意一个 tab 登录后,postmessage 到另外一个 tab |
14
putyy 2023-02-01 09:16:53 +08:00
cookie 存储 token *.xxx.com 同域 没记错的话应该可以读取到
|
15
putyy 2023-02-01 09:30:18 +08:00 1
看错了,如果要保持两个共享登录状态的话,任意端登录先重定向到另一端确定对端是否登录,如果登录就共享对端的 token, 如果对端没有登录那就执行登录 token 存放在本端 sessionStore ,如果后面增加其他子域名,可以做一个单独的中间页来存放 token ,其他端对登录都重定向到这个页面确定登录、登录成功也进行存储到中间页,重定向应该可以用影藏的 iframe 来代替,,好久没写了 不过你可以试试
|
16
iapplebear OP 谢谢各位,我认真看下各位的实现
|
17
summerLast 2023-02-01 10:20:40 +08:00
这个也简单,每个页面 sessionStorage 存一个 自己的 token ,token 是有时长的
|
18
iapplebear OP @dusu 恐怕不行,不能和其他业务子域名有交集,每天数亿的请求
|
19
dawnsw 2023-02-01 11:08:30 +08:00
试试 jwt + sessionStoroage + messageChannel(共享 jwt)
|
20
PEax 2023-02-01 11:23:56 +08:00
[关闭浏览器算退出登录,同时关闭官网和控制台 2 个 tab 也算退出登录,但是只要官网和控制台有一个 tab 在就算登录状态] 能不能简单理解为,只要任意一个保持心跳就可以了? 存储同域的 cookie ( xxx.domain.com ),然后官网跟控制台都添加心跳 ?
|
21
hoythan 2023-02-01 13:48:10 +08:00
同时关闭官网和控制台 2 个 tab 也算退出登录
这需求本来就是不合理的啊。。。。那我如果只有一个 a 页面,点击以后重定向到 b 页面,这时候对 a 来说 tab 已经算关闭了,那 b 页面就应该是退出登录的状态吧? |
22
hoythan 2023-02-01 13:48:50 +08:00
Cookie 方案是无解的,解决不了 “同时关闭官网和控制台 2 个 tab 也算退出登录”,
只能解决关闭浏览器算退出。 |
23
starerlloll 2023-02-01 14:19:27 +08:00
长连接吧, 后台维持一个 session 的池。
问题主要在于能检测到浏览器或者 tab 的关闭。。。其他的反而不复杂。。。 |
24
dudubaba 2023-02-01 14:54:51 +08:00
官网和控制台分别发送心跳,用唯一 key 区分,两者都超过心跳时间退出登录,否则保持登录状态
|
25
15hop 2023-02-01 17:39:23 +08:00
@MuscleOf2016 session cookie 方案在 tab 关闭的情况下 cookie 依然存在,需要关闭浏览器才会把 cookie 销毁,不满足楼主说的场景
|