xiaoxunbiao2009 2024-03-17 21:45 采纳率: 0%
浏览 17

上下文中的信息是怎么获取的?

最近在用springsecurity,发现有个contenxt上下文的概念,看了下里面其实本质是threadlocal,key是当前线程,value是放置的值。
问题来了,我调用了登录接口,输入用户名密码登录成功了,这个时候上下文会将我登录时的线程作为key,用户信息为value存在context中。
假如我再调用修改用户接口或者其他业务的接口,我的线程可能就不是之前那个了线程了,这个时候怎么还能拿到上下文中的信息呢?假如有100个用户都是登录态,context是怎么区分这些用户能准确拿到自己的上下文信息呢?(不考虑cookie、session、redis这些缓存技术)
请大家帮忙回答下,我想了很久,始终没想清楚。谢谢。(很久没来csdn提问了,找不到悬赏分数的地方了,是改规则了?)

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2024-03-17 21:45
    关注

    xiaoxunbiao2009 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    上下文信息是在代码中获取的,通过使用Spring Security的相关功能,可以在登录时将用户信息存储在上下文中。具体来说,按照您提供的信息,Spring Security中的上下文实际上是基于ThreadLocal实现的,可以认为是一个线程级别的存储空间。

    当您调用修改用户接口或其他业务接口时,可能会切换到不同的线程,导致无法直接访问之前登录时存储在上下文中的用户信息。为了解决这个问题,可以考虑以下解决方案:

    1. 使用Token或者Session:

      • 在登录成功后,生成一个唯一的token或者使用Session来标识当前的用户会话。
      • 在修改用户接口或其他业务接口中,通过传递这个token或者Session ID来获取相关的用户信息。这样就可以不依赖于线程上下文,而是通过标识符来获取对应用户的信息。
    2. 使用Filter或Interceptor:

      • 在登录成功后,在请求处理链中添加一个Filter或Interceptor。
      • 在Filter或Interceptor中,将用户信息存储在请求的上下文中(可以是Request级别的Attribute)。
      • 在修改用户接口或其他业务接口中,通过读取请求上下文的信息来获取用户信息。
    3. 使用AOP:

      • 在登录成功后,在AOP切面中获取用户信息,并将其存储在一个容器中(可以是ThreadLocal)。
      • 在修改用户接口或其他业务接口中,通过访问该容器来获取用户信息。

    无论使用上述哪种方案,需要保证每个用户的访问都是独立的,不能混淆用户的上下文信息。这可以通过在每个请求中提供唯一的标识符来实现,比如在请求的Header中添加一个特定字段来标识用户。

    另外,关于是否提供悬赏分数的问题,建议您咨询CSDN官方的客服部门。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月17日