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。
应该如何做呢?可以给个比较详细的代码吗?网上的资料试了都不太行。

阅读 36k
2 个回答

我发现其实不应该这样做,与session有关的操作,应该放在能获取到session的上下文中(如Controller中),而不应该放在一个单独的线程中,大概是因为项目的线程和context无关,所以线程中无法获取session。正确的做法应该是把和session有关的操作放到Controller中(或其他含有context的环境),再转移到线程进行处理。

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

我猜楼主你是需要这个

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏