【问题标题】:Get Session in Spring AOP在 Spring AOP 中获取会话
【发布时间】:2014-05-16 13:48:58
【问题描述】:

我不确定我的代码是否是线程安全的,有人可以帮忙吗?

@Aspect
public class MyAspect {

   @Autowired
   private HttpSession session;


   @Before("...")
   private void myMethod() {
       seesion.getId();
   }

}

因为 MyAspect 的作用域是默认的(单例),所以同时存在这么多请求以及许多会话。好的,我在我的代码中获得了哪个会话?它是线程安全的吗?或者它是一个错误的代码,如果它是错误的,如何可以吗?

谢谢!

【问题讨论】:

    标签: spring session thread-safety aop spring-aop


    【解决方案1】:

    好的,没关系。

    1. 您的MyAspect 无论如何都应该注册为 bean。

    2. 不管是不是 AOP Aspect:依赖注入基础设施都一样。

    3. 现在关于HttpSession。 这个对象没有注册为 bean,但是 Spring 为他提供了一个技巧 - WebApplicationContextUtils.SessionObjectFactory。该对象注册为

    beanFactory.registerResolvableDependency(HttpSession.class, new SessionObjectFactory());

    当注入工作时,它会将SessionObjectFactoryProxy 包装起来,以根据需要从ThreadLocal<RequestAttributes> 变量调用真实方法。这意味着,如果您当前的线程是 Servlet 线程,那么每次调用 MyAspect.myMethod 都会执行具体的 HttpSession

    所以,您的问题的答案是:是的,它是线程安全的

    【讨论】:

    • 感谢 Artem!好答案!
    猜你喜欢
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2017-05-30
    • 2017-07-03
    • 2010-12-29
    • 1970-01-01
    • 2016-06-09
    • 2018-01-17
    相关资源
    最近更新 更多