V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iapplebear
V2EX  ›  程序员

求教个前端登录功能实现思路

  •  
  •   iapplebear · 56 天前 · 1844 次点击
    这是一个创建于 56 天前的主题,其中的信息可能已经有所发展或是发生改变。

    产品提了个奇葩需求,暂时没好的解决方案求助下大家。 官网:a.xxx.com ,控制台:a-admin.xxx.com 。需要在官网登录后控制台也保持登录状态(这块以前种 cookie 能实现),现在产品的需求是官网或控制台页面(都是 React 单页面,前提都是登录状态),关闭浏览器算退出登录,同时关闭官网和控制台 2 个 tab 也算退出登录,但是只要官网和控制台有一个 tab 在就算登录状态,有点麻了。。

    25 条回复    2023-02-01 17:39:23 +08:00
    MuscleOf2016
        1
    MuscleOf2016  
       56 天前
    cookie + session ?
    damngoto
        2
    damngoto  
       56 天前
    我建议揍 TA 一顿
    learningman
        3
    learningman  
       56 天前   ❤️ 1
    换 jwt 类似的带状态的 session ,每个页面都定期轮询确保 session 有效,一段时间没轮询就注销掉这个 session 。
    这样只要有任意一个页面开着就能有效。
    dusu
        4
    dusu  
       56 天前 via iPhone
    这不是正常需求么?
    jwt 写到整个域名下 .xxx.com
    前端做个心跳来维持 cookie
    klo424
        5
    klo424  
       56 天前   ❤️ 1
    需要后端配合吧。

    前端 30s 一心跳维持 cookie ,后端接收心跳与前一次心跳比较,时差超过 1min 就告诉前端掉线。
    soupu626
        6
    soupu626  
       56 天前   ❤️ 1
    简单想的
    后端 session 过期时间设置短一点,比如 10 秒,然后前端 3 秒心跳保活刷新过期时间?
    moxxun
        7
    moxxun  
       56 天前 via iPhone
    试试 window.postMessage
    KuroNekoFan
        8
    KuroNekoFan  
       56 天前
    postMessage 加 sessionStorage 咯....
    cpstar
        9
    cpstar  
       56 天前   ❤️ 1
    除了被动轮询,这不太可能啊,两个 tab 直接不可能通信,一个 tab 关了它怎么知道还有别的 tab 在。

    除非。。。
    每次请求都刷新一次后台的 session ,每次关闭 tab 或者窗口(onunload)都向后台告知退出了。然后后台来判定这个上一次报告的退出和下一次的请求是否是曾经的某个同一次登录。如果两个域在不同的容器里,再互通一下有无吧。
    gausszhou
        10
    gausszhou  
       56 天前
    > 同时关闭官网和控制台 2 个 tab 也算退出登录
    这需求....
    InoriLover
        11
    InoriLover  
       56 天前   ❤️ 1
    services worker
    sw 来管凭据,tab 都关的话 sw 就没了
    Lukedis
        12
    Lukedis  
       56 天前   ❤️ 1
    域名共享 token,后端 token+redis,tap 关闭告诉后端 tap 关闭,两个 tap 都是关闭状态,直接让 token 失效
    wingkwanli888
        13
    wingkwanli888  
       56 天前 via iPhone   ❤️ 1
    Postmessage

    情境一,先开了官网 Tab, 登录了官网后,用户再开一个新的 tab 打开控制台,控制台 tab 每次一刷新就 postmessage 问隔壁的官 tab 获取 token

    情境二,同时打开两个 tab, 全意一个 tab 登录后,postmessage 到另外一个 tab
    putyy
        14
    putyy  
       56 天前
    cookie 存储 token *.xxx.com 同域 没记错的话应该可以读取到
    putyy
        15
    putyy  
       56 天前   ❤️ 1
    看错了,如果要保持两个共享登录状态的话,任意端登录先重定向到另一端确定对端是否登录,如果登录就共享对端的 token, 如果对端没有登录那就执行登录 token 存放在本端 sessionStore ,如果后面增加其他子域名,可以做一个单独的中间页来存放 token ,其他端对登录都重定向到这个页面确定登录、登录成功也进行存储到中间页,重定向应该可以用影藏的 iframe 来代替,,好久没写了 不过你可以试试
    iapplebear
        16
    iapplebear  
    OP
       56 天前
    谢谢各位,我认真看下各位的实现
    summerLast
        17
    summerLast  
       56 天前
    这个也简单,每个页面 sessionStorage 存一个 自己的 token ,token 是有时长的
    iapplebear
        18
    iapplebear  
    OP
       56 天前
    @dusu 恐怕不行,不能和其他业务子域名有交集,每天数亿的请求
    dawnsw
        19
    dawnsw  
       56 天前
    试试 jwt + sessionStoroage + messageChannel(共享 jwt)
    PEax
        20
    PEax  
       56 天前
    [关闭浏览器算退出登录,同时关闭官网和控制台 2 个 tab 也算退出登录,但是只要官网和控制台有一个 tab 在就算登录状态] 能不能简单理解为,只要任意一个保持心跳就可以了? 存储同域的 cookie ( xxx.domain.com ),然后官网跟控制台都添加心跳 ?
    hoythan
        21
    hoythan  
       55 天前
    同时关闭官网和控制台 2 个 tab 也算退出登录

    这需求本来就是不合理的啊。。。。那我如果只有一个 a 页面,点击以后重定向到 b 页面,这时候对 a 来说 tab 已经算关闭了,那 b 页面就应该是退出登录的状态吧?
    hoythan
        22
    hoythan  
       55 天前
    Cookie 方案是无解的,解决不了 “同时关闭官网和控制台 2 个 tab 也算退出登录”,
    只能解决关闭浏览器算退出。
    starerlloll
        23
    starerlloll  
       55 天前
    长连接吧, 后台维持一个 session 的池。
    问题主要在于能检测到浏览器或者 tab 的关闭。。。其他的反而不复杂。。。
    dudubaba
        24
    dudubaba  
       55 天前
    官网和控制台分别发送心跳,用唯一 key 区分,两者都超过心跳时间退出登录,否则保持登录状态
    15hop
        25
    15hop  
       55 天前
    @MuscleOf2016 session cookie 方案在 tab 关闭的情况下 cookie 依然存在,需要关闭浏览器才会把 cookie 销毁,不满足楼主说的场景
    关于   ·   帮助文档   ·   博客   ·   nftychat   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   3327 人在线   最高记录 5556   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 04:31 · PVG 12:31 · LAX 21:31 · JFK 00:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.