浏览器如果不用 Cookie,是不是就没办法做到“关闭浏览器再重新打开就要重新登陆”了? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
mitu9527
V2EX    程序员

浏览器如果不用 Cookie,是不是就没办法做到“关闭浏览器再重新打开就要重新登陆”了?

  •  
  •   mitu9527 2020-09-04 18:41:06 +08:00 4998 次点击
    这是一个创建于 1914 天前的主题,其中的信息可能已经有所发展或是发生改变。

    传统的网站可以使用“会话 Cookie”,如果浏览器关闭,这种 Cookie 就会过期,所以关闭浏览器后再打开该网站就要重新登陆。

    如果换成前后端分离,并且因为跨域和部分客户端不支持 Cookie 导致不能使用 Cookie 的话,此时浏览器好像并没有什么办法能做到“关闭浏览器再重新打开就要重新登陆”,是不是这样呢?还是说有什么办法可以做到?

    33 条回复    2020-09-07 11:33:11 +08:00
    cigmax
        1
    cigmax  
       2020-09-04 18:45:08 +08:00 via iPhone
    jwt
    javalaw2010
        2
    javalaw2010  
       2020-09-04 18:46:26 +08:00
    也许可以看看 SessionStorage
    mitu9527
        3
    mitu9527  
    OP
       2020-09-04 18:46:36 +08:00
    @cigmax JWT 能做到关闭浏览器后就失效么?好像不能吧
    mitu9527
        4
    mitu9527  
    OP
       2020-09-04 18:48:21 +08:00
    @javalaw2010 我不是前端,不过我也以为借助 SessionStorage 可以做到,去专门查了一下资料,好像并不可以。
    JJstyle
        5
    JJstyle  
       2020-09-04 18:49:31 +08:00 via iPhone
    localStorage 可以
    mitu9527
        6
    mitu9527  
    OP
       2020-09-04 18:49:34 +08:00
    @mitu9527 SessionStorage 貌似在多页应用下会出问题。
    mitu9527 /td>
        7
    mitu9527  
    OP
       2020-09-04 18:50:17 +08:00
    @JJstyle localStorage 不是永久存储么,浏览器关闭会自动清除么?好像不能吧。
    JJstyle
        8
    JJstyle  
       2020-09-04 18:51:26 +08:00 via iPhone
    @mitu9527 为什么要关闭浏览器自动清除 localstorage
    mitu9527
        9
    mitu9527  
    OP
       2020-09-04 18:52:51 +08:00
    @JJstyle 就是好奇是不是就不能做到传统网站那种“关闭浏览器后再打开就要重新登陆”了。
    ochatokori
        10
    ochatokori  
       2020-09-04 18:53:16 +08:00 via Android
    监听 close 事件清除 localstorage
    crclz
        11
    crclz  
       2020-09-04 18:54:12 +08:00
    服务端提供两种方式的认证:通过 cookie 、通过 header 里面附带一个 token (习惯于使用 jwt 来承载数据)。与之对应的是,服务端的登录接口要返回对应的 token 。

    客户端如果不能使用 cookie,就使用 localStorage 。在执行登录的时候在 localStorage 保存返回的 token,并且在后续请求中在 header 附带这个 token 。
    crclz
        12
    crclz  
       2020-09-04 18:55:19 +08:00
    抱歉,看错问题了。
    mitu9527
        13
    mitu9527  
    OP
       2020-09-04 18:56:17 +08:00
    @crclz 你说的我知道,不过我不是在问 Token 、Session 和 Cookie 哈。
    yushiro
        14
    yushiro  
       2020-09-04 18:56:55 +08:00 via iPhone   1
    是我语文没学好?还是 lz 表达错了?
    不用 cookie,关闭浏览器,再打开网站,肯定要重新登陆啊,你的登陆信息没有保存。
    mitu9527
        15
    mitu9527  
    OP
       2020-09-04 18:58:07 +08:00
    @ochatokori 全清理了?那是不是所有本地数据都没了?如果是的话,虽然好像确实达到了目的,但是应该也会有副作用吧。
    wanguorui123
        16
    wanguorui123  
       2020-09-04 18:58:32 +08:00 via iPhone
    了解下浏览器的 unload 事件
    javalaw2010
        17
    javalaw2010  
       2020-09-04 18:58:34 +08:00
    @mitu9527 我也不是前端,只是开个脑洞:sessionStorage tab 页之间的上下文是独立的,那么是不是可以通过 tab 页面之间通信的方式共享 sessionStorage,从而达到全局共享同一个 SessionStorage 上下文内容的目的
    ochatokori
        18
    ochatokori  
       2020-09-04 18:59:12 +08:00 via Android
    不过本来这个就是 sessionstorage 做的事,不知道你说的多页面会出问题会出什么问题
    JJstyle
        19
    JJstyle  
       2020-09-04 18:59:26 +08:00 via iPhone
    抱歉我也看错问题了
    mitu9527
        20
    mitu9527  
    OP
       2020-09-04 18:59:37 +08:00
    @yushiro 前后端分离一般都用 Token,不过我也忘记说了。
    mitu9527
        21
    mitu9527  
    OP
       2020-09-04 19:01:23 +08:00
    @javalaw2010 感觉有可能,postMessage ?坐等专业前端给与解答。
    crclz
        22
    crclz  
       2020-09-04 19:01:39 +08:00
    可以以 localStorage 为存储,实现 session 级别的存储。
    在 localStorage 里面存储: key=accesstoken, value 包含 2 个字段,一个是 lastTouch,一个是 token 。

    每 1 秒执行一下 touch 函数。touch 函数的行为:如果 now - lastTouch > 3 sec,则删除'accesstoken'对应的数据。否则就更新 lastTouch 。
    mitu9527
        23
    mitu9527  
    OP
       2020-09-04 19:06:31 +08:00
    @wanguorui123 我刚才去网上搜了一下,“如果您重载页面,也会触发 unload 事件”,那刷新页面也会清空凭据?
    anguiao
        24
    anguiao  
       2020-09-04 20:55:50 +08:00 via Android
    可以借助 localStorage 和 storage 事件,实现跨标签页共享 sessionStorage 。
    yulon
        25
    yulon  
       2020-09-05 19:06:07 +08:00
    以前有家 StartSSL 可能想炫技吧,是用证书登陆的,然后喜闻乐见的是,买的证书一年半载才需要续,每次要续的时候,如果重装过系统或浏览器,老是忘记登陆证书放在哪里了
    o0
        26
    o0  
       2020-09-05 23:52:19 +08:00
    多年前的网站会把 token 放到地址栏里面。
    namelosw
        27
    namelosw  
       2020-09-06 01:26:02 +08:00
    unload 可以,清楚 localStorage 是个同步操作所以大部分时候是好用的。但是并完全不可靠,毕竟可以拔电源。
    zhugefubin
        28
    zhugefubin  
       2020-09-06 11:48:48 +08:00 via Android
    做个本地的定时,记录时间,时间间隔超过一定的时间就重新登录
    mitu9527
        29
    mitu9527  
    OP
       2020-09-06 12:14:11 +08:00
    @zhugefubin 如果是这种,哪里还需要本地做,直接 Token 中加过期时间了。
    marcong95
        30
    marcong95  
       2020-09-06 22:47:36 +08:00
    你要关闭浏览器 /页面 /app 之后清除 token 的话,你完全不用任何处理,找个全局变量放起来就行了吧。

    只有你需要考虑下次打开维持登录状态才要考虑 token 的持久化吧
    lscexpress
        31
    lscexpress  
       2020-09-07 10:20:31 +08:00
    websocket,断开连接就清除用户信息。
    可以做到闭浏览器再重新打开就要重新登陆,但刷新也变得需要重新登录了,哈哈,没想到吧。
    但也不是没办法解决,需要你会 chrome 应用开发。这样子你的成本会变很高,去实现一个需求。
    我盲猜你是新人,因为新人不会在技术和业务之中需求平衡点,简单点来说就是怼产品的奇葩需求。
    zhuweiyou
        32
    zhuweiyou  
       2020-09-07 10:39:32 +08:00
    sessionStorage 关闭浏览器会自动清掉
    alertZ
        33
    alertZ  
       2020-09-07 11:33:11 +08:00
    用 sessionStorage 。我在多页面情况下使用这个并没有出现啥特殊情况。当浏览器关闭后重新进入就需要重现登录了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2911 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 13:52 PVG 21:52 LAX 05:52 JFK 08:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86