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

请问大佬, Java web 后端如何存储和获取当前用户及其部门等信息?

  •  
  •   taogen ·
    tagnja · 2024-01-26 14:46:22 +08:00 · 3440 次点击
    这是一个创建于 370 天前的主题,其中的信息可能已经有所发展或是发生改变。
    21 条回复    2024-02-20 12:01:37 +08:00
    echo1937
        1
    echo1937  
       2024-01-26 14:55:08 +08:00   ❤️ 1
    前端请求进来的时候,带上 token ,处理请求时通过 token 即可查询得到当前用户及其部门,如果是 jwt 的话,可直接保存非敏感信息,直接取出来。
    j1132888093
        2
    j1132888093  
       2024-01-26 14:58:06 +08:00
    这问题和 请问怎么用 Java 写一个网站 有什么区别....
    taogen
        3
    taogen  
    OP
       2024-01-26 15:04:41 +08:00
    @j1132888093 具体一点就是,如何在任意方法中获取当前用户信息?不想从 controller 一直传下去
    taogen
        4
    taogen  
    OP
       2024-01-26 15:07:22 +08:00
    公司老项目没用 Spring Security
    komorebi12138
        5
    komorebi12138  
       2024-01-26 15:07:51 +08:00
    可以存 redis 里面,以后通过 redis 取
    fu82581983
        6
    fu82581983  
       2024-01-26 15:08:44 +08:00   ❤️ 2
    @taogen 写个 filter 保存到 ThreadLocal
    bacon2994
        7
    bacon2994  
       2024-01-26 15:11:35 +08:00
    前端带 token ,进来用 aop 解析完用户信息之后放入 threadLocal 中,写个工具类,需要的时候就能取到
    Leviathann
        8
    Leviathann  
       2024-01-26 15:21:05 +08:00
    从 controller 一直传下去
    有什么问题

    乱搞 threadlocal 和用 map 传参有什么区别
    issakchill
        9
    issakchill  
       2024-01-26 15:27:53 +08:00
    token 进来的时候 常用信息写 threadlocal redis 也存一份
    totoro52
        10
    totoro52  
       2024-01-26 15:34:45 +08:00   ❤️ 1
    要么 filter 要么 interceptor , 塞进当前线程 threadlocal 用完记得 remove 就行了, 不然会内存泄露
    taogen
        11
    taogen  
    OP
       2024-01-26 15:36:16 +08:00
    @Leviathann #8 代码显得很臃肿。整个调用链每个方法都要带上用户参数。有些中间方法可能用不到这个参数但也要带。
    ZField
        12
    ZField  
       2024-01-26 15:39:46 +08:00
    可以在你鉴权的时候塞进本地线程里,然后需要的时候在从里面取出来,或者直接上 redis
    j1132888093
        13
    j1132888093  
       2024-01-26 15:50:31 +08:00
    @taogen #3 我们公司用 jwt ,前端通过请求头传给后端,后端不管在哪儿都能用 RequestContextHolder 去拿请求头里的 token 然后解析出用户信息
    whoisjohnlee
        14
    whoisjohnlee  
       2024-01-26 16:00:28 +08:00
    楼上各位是没写过 Java Web 吗?还各种玩意儿一大堆,直接丢 Session 不就可以了? Spring 也提供了 Session 序列化存储到 Redis ,需要这么多乱七八糟的东西吗?
    RightHand
        15
    RightHand  
       2024-01-26 16:13:26 +08:00 via Android
    weakmap ?
    justNoBody
        16
    justNoBody  
       2024-01-26 16:14:25 +08:00 via iPhone
    麻烦 OP 老老实实从 controller 传进去。
    不要让你的逻辑代码和用户状态绑定,要有约束,对于入参要有固定的返回结果,你的方法越简单,维护起来越容易,也方便其他人维护。
    你现在还有救,别乱搞,屎山就是到处捆绑状态来的,反正让我做代码审查,我肯定不会同意。
    至于你用 session ,jwt ,还是 redis 这是另外的话题。
    如果你的系统是单体应用,且很大概率在未来两三年内都不会部署多个节点,那就用 session 。
    如果需要部署多个节点,又不想依赖于三方组件,想降低维护成本,那就自签 jwt 。
    至于 redis ,如果你真的需要,你就不会发这个帖子
    taogen
        17
    taogen  
    OP
       2024-01-26 16:14:29 +08:00
    @whoisjohnlee 是啊,放到 session 中也行,可以不用 ThreadLocal 了。
    leimu012
        18
    leimu012  
       2024-01-26 16:50:48 +08:00
    @fu82581983 +1 ,我们就是这么用的,再写个从 ThreadLocal 取各种信息的工具类,其他地方直接用这个工具类 get 就行
    KOMA1NIUJUNSHENG
        19
    KOMA1NIUJUNSHENG  
       2024-01-26 16:54:10 +08:00
    单机 session ,spring security 的实现原理也是 ThreadLocal 。
    SilenceLL
        20
    SilenceLL  
       2024-01-26 17:08:50 +08:00
    jwt 存用户 id ,请求进来的时候在拦截器中查询用户对应的信息存储到 ThreadLocal 中
    SkyLine7
        21
    SkyLine7  
       345 天前
    threadlocal
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1500 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:31 · PVG 08:31 · LAX 16:31 · JFK 19:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.