springboot普通类中如何获取session?

在springboot项目中有一个消息处理类,要在其中获取到httpSession,用@Autowired获取不到。

public class TMessageHandlerFactory implements MessageHandlerFactory {
    @Autowired
    private HttpSession session;
    
    @Override
    public void data(InputStream data) {
        int userId = (int)session.getAtrribute("key");        //这里的session为空
        ....        //插入数据
    }
}

如果用构造函数传过来也不行。

@Component
public class SMTPRunner implements ApplicationRunner {
    @Autowired
    private UserService userService;    //不明白为什么这个可以获取到
    @Autowired
    private HttpSession session;        //这个却不行
    
    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        TMessageHandlerFactory myFactory = new TMessageHandlerFactory(session);
        ....
    }
}

即使使用SpringBeanFacotryUtil (implements ApplicationContextAware) 也不行。

@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;
        }
    }
    
    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
    
    //通过name获取 Bean.
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }
    
    //通过class获取Bean.
    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);
    }
}

这种方法只能获取到自定义的bean(UserService这种),获取不到HttpSession这种Bean。
应该如何做呢?可以给个比较详细的代码吗?网上的资料试了都不太行。

沧海一幻觉
浏览 1435回答 2
2回答

红糖糍粑

//获取到当前线程绑定的请求对象HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();//已经拿到session,就可以拿到session中保存的用户信息了。System.out.println(request.getSession().getAttribute("userInfo")); 我猜楼主你是需要这个

梵蒂冈之花

我发现其实不应该这样做,与session有关的操作,应该放在能获取到session的上下文中(如Controller中),而不应该放在一个单独的线程中,大概是因为项目的线程和context无关,所以线程中无法获取session。正确的做法应该是把和session有关的操作放到Controller中(或其他含有context的环境),再转移到线程进行处理。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java