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

我司 Java 后端的骚操作

  •  
  •   xutao881 · 2019-02-22 09:20:00 +08:00 · 18732 次点击
    这是一个创建于 1862 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们公司的多点登录一直没实现,今天早上公司的 JAVA 找我说,让我前端来实现用户的多点登录,只要把 sessionID 和 token 存下来就行了,我特么喵也是醉了,是我技术水平不够么?我怎么有点懵逼呢?用户多点登录居然让前端来做??

    155 条回复    2019-02-23 17:27:34 +08:00
    1  2  
    Yuicon
        1
    Yuicon  
       2019-02-22 09:25:43 +08:00
    熟悉的前后端分锅现场
    qping
        2
    qping  
       2019-02-22 09:25:46 +08:00
    多点登陆还是单点登陆?
    momuou
        3
    momuou  
       2019-02-22 09:25:54 +08:00
    --只是存而已吧。。可能是想让你前端放在缓存上,让他后端能拿到不用通过 URL 带过来吧
    wrq
        4
    wrq  
       2019-02-22 09:26:30 +08:00
    你开始了
    DonaldY
        5
    DonaldY  
       2019-02-22 09:27:15 +08:00
    什么是多点登录。。。
    keepeye
        6
    keepeye  
       2019-02-22 09:28:40 +08:00
    多点登录是什么?
    liuxu
        7
    liuxu  
       2019-02-22 09:29:51 +08:00
    单点登录是故意限制的啊。。默认不开发单点登录就是多点登录
    stormwu
        8
    stormwu  
       2019-02-22 09:30:06 +08:00
    单点登陆吧
    myhot21
        9
    myhot21  
       2019-02-22 09:30:44 +08:00
    这和我们的实现做法一样,没有错。
    RoyL
        10
    RoyL  
       2019-02-22 09:31:04 +08:00
    ....多点登陆,可能确实是你技术不够吧
    litujin1123
        11
    litujin1123  
       2019-02-22 09:31:06 +08:00
    多点登录是啥?
    zhangjinglongi
        12
    zhangjinglongi  
       2019-02-22 09:31:32 +08:00
    你前端不做难道让后端拿取登录状态 session cookie ?
    Raisu
        13
    Raisu  
       2019-02-22 09:33:14 +08:00
    我水平不够啊,怎么看不懂啊
    ssynhtn
        14
    ssynhtn  
       2019-02-22 09:34:56 +08:00   ❤️ 1
    一瞬间我以为多点已经这么牛了,都出第三方登录系统了
    MineDog
        15
    MineDog  
       2019-02-22 09:35:39 +08:00 via Android
    sso 吗?
    pudgedoor
        16
    pudgedoor  
       2019-02-22 09:38:05 +08:00 via Android
    我们公司就是前端做的单点
    xutao881
        17
    xutao881  
    OP
       2019-02-22 09:38:49 +08:00
    不知道为啥没法 append,我说的有问题,不是多点登录,是多账号同时登录,因为现在的登录是多标签页登录多个用户只有最后一个用户的登录状态有效,我们想做的是多标签页,支持多用户登录。
    szpShang
        18
    szpShang  
       2019-02-22 09:40:09 +08:00   ❤️ 4
    如果下属以这个理由回怼回来。我想知道上面的领导要怎么做呢?
    1.耐心跟前端讲解 http 协议等一大堆前端知识。更甚者跟他说把信息存 cookie 里面。
    2.换个其他有能力的同事做。
    3.直接开人。
    bridgeca0
        19
    bridgeca0  
       2019-02-22 09:40:15 +08:00
    怀疑你们说的单点登录是不是我理解的单点登录
    xzg
        20
    xzg  
       2019-02-22 09:40:53 +08:00
    对哦 多点登录就不用开发吧(手动滑稽)
    arrow8899
        21
    arrow8899  
       2019-02-22 09:42:08 +08:00   ❤️ 7
    @litujin1123 就是用户在同一个浏览器里打开多个不同的系统(不同域名),可以共享登录状态。
    由于浏览器的跨域限制,不同域之间没法共享 cookie 和 localstorage 等。所以需要新增一个统一登录入口(认证系统),当用户访问一个新系统,系统检测到未登录时,就重定向到认证系统,如果用户已经登录过了,那么认证系统里面是有 cookie 的,然后重定向到新系统并带上 set-cookie header,这样就不用重复登陆了
    muzhidianzi
        22
    muzhidianzi  
       2019-02-22 09:42:44 +08:00 via Android
    @ssynhtn 哈哈
    hellormrfool
        23
    hellormrfool  
       2019-02-22 09:43:07 +08:00
    pm 比较骚 什么业务啊想开开眼界 @xutao881
    cedoo22
        24
    cedoo22  
       2019-02-22 09:43:49 +08:00
    emmmmm
    2033009565
        25
    2033009565  
       2019-02-22 09:43:50 +08:00
    楼主的意思是同时登陆多个账号
    arrow8899
        26
    arrow8899  
       2019-02-22 09:44:07 +08:00
    @xutao881 多账号,这个就没办法用 cookie 了吧,只能把 token 放全局变量里面,每次请求的时候手动带上去。。
    wweir
        27
    wweir  
       2019-02-22 09:44:26 +08:00 via Android
    弱弱问下,基于 jwt 的方案,怎么优雅地实现单点登录
    javaWeber
        28
    javaWeber  
       2019-02-22 09:44:53 +08:00
    @bridgeca0 怀疑你们说的单点登录是不是我理解的单点登录
    =======================================
    我也看得有点蒙。。
    cedoo22
        29
    cedoo22  
       2019-02-22 09:45:18 +08:00
    单点登录多点登录,这个不说,java 同学,可能只是想让你配合他实现这个功能,你这里只是很小一部分。
    v2chou
        30
    v2chou  
       2019-02-22 09:46:31 +08:00
    @xutao881 1.浏览器多个 tab 打开你们的同一个域名的网站实现多个人登录。2.浏览器多个 tab 打开你们不同域名的网站实现多个人登录


    你说的是哪一个
    lanterboy
        31
    lanterboy  
       2019-02-22 09:46:39 +08:00
    我一个 JAVA 的,看得也有点懵
    murmur
        32
    murmur  
       2019-02-22 09:46:58 +08:00
    多点登录就是拿到 session 然后前端在 iframe 里偷偷把所有接口都访问一遍创建 cookies 啊
    cqu1980
        33
    cqu1980  
       2019-02-22 09:47:53 +08:00
    @xutao881 你们后端说得没错,可以你保存,前提是登录完成后,把 sessionID 和 token 返还给你,你在每个 query 操作的时候带上给他...因为如果使用 cookie 来保存的话,由于 key 值一样,所以 value 值会被覆盖成最后一个...
    cqu1980
        34
    cqu1980  
       2019-02-22 09:50:12 +08:00
    @lanterboy sessionID 一般是使用 cookie 保存的,如果不使用 cookie 保存的话,一般可以通过 url 地址或者隐藏表单文本框的方式来实现,道理是一样的。他这里如果使用 cookie,会导致被覆盖,所以不能使用 cookie
    qping
        35
    qping  
       2019-02-22 09:51:09 +08:00
    @xutao881 #17 这个需求我们之前也碰到过,跟客户说了个最简单方法是浏览器新建个无痕窗口,重新登陆
    xutao881
        36
    xutao881  
    OP
       2019-02-22 09:52:16 +08:00
    @cqu1980 嗯,我和后端讨论一下,只是他刚开始这么说,有点反直觉。
    cqu1980
        37
    cqu1980  
       2019-02-22 09:52:25 +08:00
    @qping 这个才是最好的办法,新开一个进程,而不是一个标签~
    qping
        38
    qping  
       2019-02-22 09:52:50 +08:00
    @xutao881 #17 真正的功能实现,确实是要前后端配合来做的。
    -----
    利益无关,我是后端
    VoidChen
        39
    VoidChen  
       2019-02-22 09:53:27 +08:00
    所以后端并没有骚操作= =
    qping
        40
    qping  
       2019-02-22 09:56:35 +08:00
    我觉得吧,还是前端需要学点后端的东西,后端需要学点前端的东西。不然沟通起来费劲~
    你看最早的程序员不都是自己学电路,焊主板么
    cqu1980
        41
    cqu1980  
       2019-02-22 09:58:44 +08:00
    @qping 在工作中学习,而不是学习后再工作,哈哈~~程序员争论问题打架都很正常.......
    qping
        42
    qping  
       2019-02-22 09:58:47 +08:00
    @cqu1980 #37 哈哈 但是单纯为了省事, 这种反人类的需求
    murmur
        43
    murmur  
       2019-02-22 09:59:21 +08:00
    @DonaldY 我理解就是比如我登录了 login.example.com ,那么 biz.example.combiz.example-mirror.combiz.example-nb.com ,这一系列网站都登录了
    hellowes
        44
    hellowes  
       2019-02-22 09:59:50 +08:00
    对,是你技术水平有问题
    notreami
        45
    notreami  
       2019-02-22 10:00:08 +08:00
    好无聊,前端会什么总喜欢拿 百度就知道的事情拐弯抹角说后端呢?
    qping
        46
    qping  
       2019-02-22 10:01:38 +08:00
    @murmur #43 这是单点登陆 ( Single Sign-on ),楼主在 17 楼补充了,他是想表达多用户登陆
    szpShang
        47
    szpShang  
       2019-02-22 10:01:47 +08:00
    @cqu1980 不用 cookie 很容易被注入的。那这个登录弄好全是漏洞,有什么意义。只要有人想办法弄到 sessionId,就能登录这个用户。
    Hazurt
        48
    Hazurt  
       2019-02-22 10:03:21 +08:00
    @murmur #43 这是单点登录,用户只需要登录一次就可以访问所有相互信任的应用系统,Single Sign On 简称 SSO。
    freakxx
        49
    freakxx  
       2019-02-22 10:07:38 +08:00
    这种应该是叫
    多用户切换,

    应该大概可以这么去做:
    可以做个绑定操作(用户判断是否有权限可以切换),然后切换时,请求过去拿新的账号的 token 或者 cookie,然后覆盖

    @qping @xutao881
    Hazurt
        50
    Hazurt  
       2019-02-22 10:07:41 +08:00
    楼主的需求我是在 Header 里面加额外属性实现的。
    freakxx
        51
    freakxx  
       2019-02-22 10:09:29 +08:00
    @Hazurt

    其实不用,每个用户的状态都是唯一的,那么拿旧的去换新的就好,中间做好切换的鉴权。
    ThreeBody
        52
    ThreeBody  
       2019-02-22 10:09:55 +08:00
    看你的评论,感觉可能你技术不够吧,这不就是前端来做的?
    dany813
        53
    dany813  
       2019-02-22 10:10:33 +08:00
    求解多点登陆
    Banxiaozhuan
        54
    Banxiaozhuan  
       2019-02-22 10:12:50 +08:00
    这中用 token 作多点登录的,有个专门的协议的,你可以去找找。 我记得大概有三种实现方式。 确实有前端存 token 的实现,还有就是用一个公共的地服务存 token。
    szpShang
        55
    szpShang  
       2019-02-22 10:14:10 +08:00
    @freakxx 你这种是比较靠谱的办法。能解决问题。 我想学习一下,作为领导要怎么处理属下这样的问题。
    xmge
        56
    xmge  
       2019-02-22 10:14:25 +08:00
    额。。。。。用 cookie 就 ok 啊,可以不用前端
    Marstin
        57
    Marstin  
       2019-02-22 10:15:14 +08:00   ❤️ 2
    多标签登录这特么就是前端去做的啊,前端的持久化可选项里,只有变量的生命周期仅在标签页内,后台怎么知道你是哪个标签。
    不管什么登录,sessionID / token 必须要存在前端

    PS:现在前端工资真好拿
    iyangyuan
        58
    iyangyuan  
       2019-02-22 10:16:54 +08:00   ❤️ 6
    多账号登录实现起来也不难,最简单的方案:不同的账号使用不同的根路径(可以直接使用账号唯一 id),然后把 cookie 写到每个账号具体的 path 下,这样多账号之间就互不影响了。对于旧系统的改造,凭空多出一个根路径可能影响原有系统,很容易解决,加一层代理,用代理去掉这层虚拟的根路径,即可实现原有系统 0 改动。
    本回复仅仅是指导性建议,需要具体业务具体分析,仅供参考!
    index90
        59
    index90  
       2019-02-22 10:17:52 +08:00
    什么是多点登录?!
    coang
        60
    coang  
       2019-02-22 10:18:07 +08:00
    @xutao881 多账户登录 要不就弄一个切换功能 要不就这么实现.. 肯定要前端配合得..
    Hazurt
        61
    Hazurt  
       2019-02-22 10:18:32 +08:00
    @freakxx #51 恩,那样也可以,这边有个额外需求,直接在 Apache 里面配置好,访问指定 URL 就是登陆状态(内网)。
    freakxx
        62
    freakxx  
       2019-02-22 10:18:38 +08:00
    @szpShang


    定好奖惩,其他按规则走,

    不关注怎么实现,实现过程,当成黑盒接收。
    Marstin
        63
    Marstin  
       2019-02-22 10:18:59 +08:00
    @freakxx 你这个解决方案比较靠谱,切换登录用户。
    如果真要实现他原始需求里,多标签登录,真的是个大坑
    Toninie
        64
    Toninie  
       2019-02-22 10:19:03 +08:00
    前端无论是存 cookie 还是 localstorage 之类,因为 key 总是固定的,打开多个标签页时,会被覆盖,但是如果不存,也会有问题,你页面刷新以后这些用户 id 和 token 都没了,所以还是楼上说无痕模式最好实现这种需求
    saberlove
        65
    saberlove  
       2019-02-22 10:19:19 +08:00
    这个需求太牛逼了 好羡慕
    freakxx
        66
    freakxx  
       2019-02-22 10:22:12 +08:00
    @Marstin


    哈哈哈哈,
    业务代码都这样的啦,
    需求你尽管提,做不出来算开发输。
    wc951
        67
    wc951  
       2019-02-22 10:22:55 +08:00 via Android
    没懂什么意思,是说新开一个标签页就要重新登录一次吗
    whileFalse
        68
    whileFalse  
       2019-02-22 10:30:39 +08:00
    @iyangyuan 这位仁兄说的是最优雅的。
    多问一句,你们前端有 node 服务器吗,还是只能控制 http 和 js ?
    freakxx
        69
    freakxx  
       2019-02-22 10:31:07 +08:00
    @Marstin

    多标签页应该要借标志,或者前端有办法获取当前标签页的唯一信息,也是可以。

    标签页 1 登陆用户 a(随意生成一个 key,存到 cookie),
    {"a": token_1}
    ?uid=a
    数据发送的时候,带上 token_1

    标签页 2 用户切换为 b(随意生成一个 key,存到 cookie),
    {"b": token_2}
    ?uid=b
    数据发送的时候,带上 token_2
    dearxe2v
        70
    dearxe2v  
       2019-02-22 10:33:05 +08:00
    涉及到登录嘛(坏笑 还是前端的锅多些,登录核心的用户操作和数据都在浏览器端维持着,是吧,跟服务器几乎没一毛钱关系
    就算是单点登录,别的域要获取 token 也是前端的锅多些是吧

    另:多点登录 也许可以翻译成:多个登录入口点(登录页面)进行登录。约等于:每个站点需单独登录。就是:普通登录。
    clecho
        71
    clecho  
       2019-02-22 10:35:17 +08:00
    单用户登陆,后台的 session 也是存在前端的 cookie 里的,多用户同时登陆,也就是多开,那就不能存在 cookie 里了,会覆盖掉,所以让你前端存起来,前端不是也有 localStorage 和 sessionStrong 吗?每次请求带上这个 session 或者 token 就行了
    q4336431
        72
    q4336431  
       2019-02-22 10:35:26 +08:00
    你的意思是,一个账号,可以同时被多个用户登录吧。
    zzzzzzZ
        73
    zzzzzzZ  
       2019-02-22 10:36:45 +08:00
    这个事不是你分内的?现在前端这么好混?
    aniua
        74
    aniua  
       2019-02-22 10:39:45 +08:00
    Google 已经为你们开发好了无痕模式,用就是了。
    66beta
        75
    66beta  
       2019-02-22 10:41:38 +08:00 via Android   ❤️ 1
    需求没说清楚,我就先不加入战斗了
    喷子的水平也是厉害,能靠想象喷
    lovedebug
        76
    lovedebug  
       2019-02-22 10:43:04 +08:00
    前后端之间用 node 架设中间件管理 session 或者 token 呀
    sstfy
        77
    sstfy  
       2019-02-22 10:44:07 +08:00
    只知道统一认证、单点登陆。。
    litujin1123
        78
    litujin1123  
       2019-02-22 10:44:57 +08:00
    @arrow8899 这个是单点登陆 sso 吧
    fengmenggaokao
        79
    fengmenggaokao  
       2019-02-22 11:14:24 +08:00
    这样也能实现,准确说最简单的实现了,如果后端优秀点,可以参考 https://www.apereo.org/projects/cas,总而言之,这个 javaer 让你这样维护应该没啥太大问题的
    DesmondLiu90
        80
    DesmondLiu90  
       2019-02-22 11:15:56 +08:00
    单点登录吧 ,java 没有什么开源的框架吗? 自己写也没什么吧, 只要把单点登录搞明白就行
    passerbytiny
        81
    passerbytiny  
       2019-02-22 11:16:33 +08:00
    @xutao881 #15 多标签页多账户同时登录,能弄出这需求,感觉不是后端骚,是产品骚。后端抛给你了“只要把 sessionID 和 token 存下来就行了”,据此推测,后端已经被产品弄崩溃了。多账户同时登录(并且不用来回切换账号)这种事,Windows、Chrome、Firefox 都没有完善解决的方案。

    标准 HTML 的 session、cookie、localStorage、sessionStrong 机制,以及标准的 sessionID、token 技术,是都实现不了你这需求的。你需要的是浏览器的黑科技,比如 Firefox 的多账户容器;或者像 @iyangyuan #52 提到的 URL 黑科技。
    wolfie
        82
    wolfie  
       2019-02-22 11:20:57 +08:00
    @xutao881 #17
    按照这个描述,每个标签独立的用户状态,确实需要传一个类似 session_id 的唯一标识。
    后端说的没问题。
    wolfie
        83
    wolfie  
       2019-02-22 11:22:41 +08:00   ❤️ 1
    append #81
    人后端没让你做,多个标签页一个会话,后端应该怎么区分。
    caomu
        84
    caomu  
       2019-02-22 11:22:47 +08:00 via Android
    google 账号是在 url 里面加上 /u/0 /u/1 等等区分
    xingyue
        85
    xingyue  
       2019-02-22 11:27:24 +08:00
    @iyangyuan #58 emmmmm 我觉得 cookie 里面改下数据结构应该就行了,如下图:

    每个 tab 页面登陆成功的时候,从后端获取 userid(如果 username 是唯一的直接存 username 更省事),对应的 session 和 token 以及过期日期 lastdate,然后 userid 在每个页面通过 js 变量维护,就可以多个 tab 页面多个用户了,页面切换登陆用户的时候,遍历 userid,找到 lastdate 没过期的,然后通过 userid 得到 username 显示给用户选择就好了~
    Marstin
        86
    Marstin  
       2019-02-22 11:33:06 +08:00   ❤️ 1
    @freakxx 是的,难点只在于标签页标识的识别与存储,解决了这个问题,和普通登录就没什么差别了。
    哈哈,不能理解以上那么多扯些乱七八糟的,真的服。
    几个顶 #58 的,真的误导人,前端持久化多个用户信息从来不是问题,问题在于没法识别标签页和哪个用户的绑定连系。前端持久化,都是以域名为单位,从来不是以标签为单位。

    这傻吊需求做出来之后,岂不是不能用 “在新标签页中打开链接” 了
    xiangyuecn
        87
    xiangyuecn  
       2019-02-22 11:34:30 +08:00
    #17 如果是要实现这种的话,确实是前端的事情。cookie、storage 之类的如果仅仅单独使用就不用考虑了,那些是共享的。不同标签下只有地址栏不是共享的,并且很多产品的管理后台就是按这种方式实现的,在 url 中来区分不同的产品 /用户。见#84 这种。
    realpg
        88
    realpg  
       2019-02-22 11:45:52 +08:00
    @xutao881 #17
    直接开发个换马甲系统算了……
    DRcoding
        89
    DRcoding  
       2019-02-22 11:49:24 +08:00
    一个浏览器保持多个登录用户吧,用 spring session 就行了
    TimLang
        90
    TimLang  
       2019-02-22 11:49:40 +08:00
    很早以前的天猫登录用的是嵌入淘宝的登录页,然后用 jsonp 做的。。当年我就是抄天猫的。。
    Zzdex
        91
    Zzdex  
       2019-02-22 11:55:20 +08:00 via iPhone
    现在都流行 不自己商量解决 来 v2 解决的吗
    zxcvsh
        92
    zxcvsh  
       2019-02-22 11:58:40 +08:00 via iPhone
    别人都搞单点,你这来多点...
    passerbytiny
        93
    passerbytiny  
       2019-02-22 12:01:05 +08:00
    @wolfie #72 建议你先去了解一下啥是 session_id。
    lizhuoli
        94
    lizhuoli  
       2019-02-22 12:07:43 +08:00 via iPhone
    这 TM 是 SSO,我看了半天才理解,为什么叫做”多点登录”
    lzhnull
        95
    lzhnull  
       2019-02-22 12:09:48 +08:00 via Android
    没有错,可以前端实现
    wangxiaoaer
        96
    wangxiaoaer  
       2019-02-22 12:10:44 +08:00 via Android
    @arrow8899 大哥,这个学名叫 单点登陆。
    karllynn
        97
    karllynn  
       2019-02-22 12:12:47 +08:00
    不就是点一下就登录的单点登录么
    youngxhui
        98
    youngxhui  
       2019-02-22 12:22:39 +08:00 via Android
    多点登录还需要故意实现?
    luoway
        99
    luoway  
       2019-02-22 12:33:29 +08:00
    只有“单点登录”的概念,难怪“多点登陆”概念有不同理解。
    也就是“非单点登录”。
    dmjob2015222
        100
    dmjob2015222  
       2019-02-22 12:35:11 +08:00
    开始你的表演给老板看!
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4998 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 05:39 · PVG 13:39 · LAX 22:39 · JFK 01:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.