最近在用springsecurity,发现有个contenxt上下文的概念,看了下里面其实本质是threadlocal,key是当前线程,value是放置的值。
问题来了,我调用了登录接口,输入用户名密码登录成功了,这个时候上下文会将我登录时的线程作为key,用户信息为value存在context中。
假如我再调用修改用户接口或者其他业务的接口,我的线程可能就不是之前那个了线程了,这个时候怎么还能拿到上下文中的信息呢?假如有100个用户都是登录态,context是怎么区分这些用户能准确拿到自己的上下文信息呢?(不考虑cookie、session、redis这些缓存技术)
请大家帮忙回答下,我想了很久,始终没想清楚。谢谢。(很久没来csdn提问了,找不到悬赏分数的地方了,是改规则了?)
上下文中的信息是怎么获取的?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
5条回答 默认 最新
檀越@新空间 2024-03-17 21:45关注xiaoxunbiao2009 晚上好🌙🌙🌙
本答案参考ChatGPT-3.5上下文信息是在代码中获取的,通过使用Spring Security的相关功能,可以在登录时将用户信息存储在上下文中。具体来说,按照您提供的信息,Spring Security中的上下文实际上是基于ThreadLocal实现的,可以认为是一个线程级别的存储空间。
当您调用修改用户接口或其他业务接口时,可能会切换到不同的线程,导致无法直接访问之前登录时存储在上下文中的用户信息。为了解决这个问题,可以考虑以下解决方案:
-
使用Token或者Session:
- 在登录成功后,生成一个唯一的token或者使用Session来标识当前的用户会话。
- 在修改用户接口或其他业务接口中,通过传递这个token或者Session ID来获取相关的用户信息。这样就可以不依赖于线程上下文,而是通过标识符来获取对应用户的信息。
-
使用Filter或Interceptor:
- 在登录成功后,在请求处理链中添加一个Filter或Interceptor。
- 在Filter或Interceptor中,将用户信息存储在请求的上下文中(可以是Request级别的Attribute)。
- 在修改用户接口或其他业务接口中,通过读取请求上下文的信息来获取用户信息。
-
使用AOP:
- 在登录成功后,在AOP切面中获取用户信息,并将其存储在一个容器中(可以是ThreadLocal)。
- 在修改用户接口或其他业务接口中,通过访问该容器来获取用户信息。
无论使用上述哪种方案,需要保证每个用户的访问都是独立的,不能混淆用户的上下文信息。这可以通过在每个请求中提供唯一的标识符来实现,比如在请求的Header中添加一个特定字段来标识用户。
另外,关于是否提供悬赏分数的问题,建议您咨询CSDN官方的客服部门。
解决 无用评论 打赏 举报-