跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 各位 30cm, 问一下 所谓的 service 层中怎么优雅获取当前用户
未分類
16 4 月 2021

各位 30cm, 问一下 所谓的 service 层中怎么优雅获取当前用户

各位 30cm, 问一下 所谓的 service 层中怎么优雅获取当前用户

資深大佬 : dengji85 1

以前一直习惯用 ThreadLocal,但在异步下就不知道怎么搞了,InheritableThreadLocal 的话,没有找到清除用户的入口,filter 肯定不行了,请求结束子线程还没完成不可能去把数据清理掉,求各位大佬指点。 现在的问题是很多代码当初只考虑的是单线程,直接 service 层获取登陆用户,现在要异步的话代码全报错了,当初这种写法是不是不能用

大佬有話說 (29)

  • 資深大佬 : buzaiyouyu123

    1.异步线程可以设置上下文,通过上下文传递
    2.想办法在子线程前后织入登录用户相关的信息,即 Context
    3.阿里的 TTL ( transmittable-thread-local )可以参考

  • 資深大佬 : buzaiyouyu123

    或者自己来实现一个线程池的 wrapper

  • 資深大佬 : HariopaNic

    自愧不如没有 30,只有 18

  • 資深大佬 : lance7in

    不敢当不敢当
    18cm 来观赏各位巨巨的优雅

  • 資深大佬 : Aruforce

    无参过去应该不行…

  • 資深大佬 : Aruforce

    @Aruforce 无参获取

  • 資深大佬 : sutra

    https://www.baeldung.com/spring-security-async-principal-propagation

  • 主 資深大佬 : dengji85

    @lance7in 谦虚了

  • 主 資深大佬 : dengji85

    @sutra 项目是自己写的 filter,就是想实现他这个效果

  • 資深大佬 : dqzcwxb

    当成参数传递给异步线程,你用其他的方式也不过是 ThreadLocal 的变种

  • 主 資深大佬 : dengji85

    @dqzcwxb 这样每个方法都得改参数

  • 資深大佬 : securityCoding

    我这边的方案是获取登录态信息只在 controller 层处理,往下层走的时候以方法参数的形式传过去。
    具体的流程是:
    1. 网关获取请求头中的 token,登录态 filter 解析 token ( isLogin,uid,uname,merchantId )设置到请求头。
    2. 网关带着登录态请求头转发请求。
    3. 底层服务从来不需要关注登录态,直接获取请求头即可。

  • 資深大佬 : securityCoding

    @dengji85 本身属于确定性的参数,就应该显示传

  • 資深大佬 : tsanie

    30 怕不是从肛门开始量(

  • 資深大佬 : hzz2

    现在问个问题都这么骚了吗

  • 資深大佬 : qwe520liao

    在同步编程模型下直接通过本地线程变量获取绑定的信息,相当于在这个线程上下文中设定了全局变量。

    使用同步编程模型,如果在 service 里面获取当前的信息,就跟使用 service 的环境耦合了(本地线程变量),service 不是无状态的。

    当然如果一直使用这种同步编程模型是没什么问题的,但如果想要在异步环境下不改变代码也可以使用 service 的话,就必须要在执行阶段先进行类似环境绑定的操作。

    比如在执行前,将之前的全局变量绑定到当前的线程,执行完以后再清除避免下一个执行任务获取到错误的信息。

  • 資深大佬 : CatKiller

    无 图 言 弔

  • 主 資深大佬 : dengji85

    @hzz2 本想加个 D cup,但好像论坛没什么女大神把

  • 資深大佬 : bz5314520

    请求来的时候,自己包装个上下文呗。

  • 資深大佬 : liuqitoday

    与 12 一样,获取登录态信息只在 controller 层处理,往下层走的时候以方法参数的形式传过去

  • 資深大佬 : keshawnvan

    作为参数传过去,Service 层不应该感知登录态的。

  • 資深大佬 : vacuitym

    我们用 dubbo 的时候是放在上下文,然后拦截之后放在 threadlocal

  • 資深大佬 : yisheyuanzhang

    异步线程是如何创建的呢?线程池?
    我们项目使用的全局线程池,方案是线程池每次执行的时候都从父线程中把
    1 、Shiro/Spring security 当前用户 context 存放在 InheritableThreadLocal 中
    2 、 线程池内线程每次执行任务时都将父线程 InheritableThreadLocal 复制给池内子线程
    记了个笔记 https://zhaoydo.gitee.io/2020/08/26/thread-pool-thread-local/

  • 資深大佬 : ychost

    Service 层不应该主动感知用户信息,应该是 Controller 层感知到,然后传给 Service 层处理,

  • 資深大佬 : xuanbg

    拦截器或网关验证 token 的时候解析出来用户信息,然后放在请求头上面。Controller 里面取出来传给 Service 。

  • 資深大佬 : xuanbg

    @yisheyuanzhang InheritableThreadLocal 这种只适合单体架构,局限性比较大

  • 資深大佬 : aguesuka

    异步怎么实现的?成熟的同步或者异步方案都有 threadlocal 或者 context(vertx)。如果没有就自己实现一个。

  • 資深大佬 : RuzZ

    > InheritableThreadLocal 这种只适合单体架构,局限性比较大
    @xuanbg 没理解为什么说 InheritableThreadLocal 只适合单体架构,我的理解 InheritableThreadLocal 本质上就是创建线程时,会将父类的`inheritableThreadLocals`复制到子类的`inheritableThreadLocals`中,一个父子级线程可以传递的 threadLocal

  • 資深大佬 : xuanbg

    @RuzZ 不同机器还能传递?

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具