如何从 Spring Boot 中的公共类获取会话?

Jul*_*ang 8 session spring spring-mvc httpsession spring-boot

我想从普通班级获得会话。使用@Autowired没有效果。

public class TMessageHandlerFactory implements MessageHandlerFactory {

    @Autowired
    private HttpSession session;

    @Override
    public void data(InputStream data) {
        int userId = (int)session.getAtrribute("key"); //session null
        ....        //do sth
    }
}
Run Code Online (Sandbox Code Playgroud)

构造函数也不起作用

@Component
public class SMTPRunner implements ApplicationRunner {

    @Autowired
    private UserService userService;    // userService can access

    @Autowired
    private HttpSession session;        // session can't access

    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        TMessageHandlerFactory myFactory = new TMessageHandlerFactory(session);
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

我也试过用SpringBeanFactory,也没用。

@Component
public class SpringBeanFactoryUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(SpringBeanFactoryUtil.applicationContext == null) {
            SpringBeanFactoryUtil.applicationContext = applicationContext;
        }
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }

    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }

    //??name,??Clazz?????Bean
    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name, clazz);
    }
}
Run Code Online (Sandbox Code Playgroud)


SpringBeanFactoryUtil只能获取我的自定义 bean,不能获取HttpSession.
我该怎么办?

Nic*_*uet 9

如果我理解正确,您想从范围更广的组件(单例)访问会话范围内的某些内容,因此系统无法知道您在实际中感兴趣的服务器中的哪一个潜在并发会话它会在 spring init 时说会话范围未定义。

您可以使用 ObjectFactory 模式(可能的解决方案之一)来解决这个问题

import `org.springframework.beans.factory.ObjectFactory`;
// ...
// ...

@Autowired
ObjectFactory<HttpSession> httpSessionFactory;
Run Code Online (Sandbox Code Playgroud)

然后当你需要它时,从绑定到会话的线程:

HttpSession session = httpSessionFactory.getObject();
Run Code Online (Sandbox Code Playgroud)

通过这种方式,spring 会绑定一个receipe 以获取您调用getObject() 方法的类型所需的对象,而不是尚未可用的实际对象。

请理解,如果在您运行代码时没有会话绑定到当前线程,这将失败(返回 null),因为没有会话可用。这意味着您要么从未能转发请求/会话的请求线程本地信息的线程调用此代码,要么从没有意义的上下文中调用此代码。