为了账号安全,请及时绑定邮箱和手机立即绑定

springboot普通类中如何获取session?

springboot普通类中如何获取session?

沧海一幻觉 2019-02-16 21:44:20
在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。应该如何做呢?可以给个比较详细的代码吗?网上的资料试了都不太行。
查看完整描述

2 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

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

我猜楼主你是需要这个

查看完整回答
反对 回复 2019-03-01
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

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

查看完整回答
反对 回复 2019-03-01
  • 2 回答
  • 0 关注
  • 1434 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信