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

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

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

    传统的网站可以使用“会话 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
        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   ·   实用小工具   ·   2945 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:00 · PVG 22:00 · LAX 06:00 · JFK 09:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.