在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ springboot普通類中如何獲取session?

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為空
        ....        //插入數(shù)據(jù)
    }
}

如果用構造函數(shù)傳過來也不行。

@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。
應該如何做呢?可以給個比較詳細的代碼嗎?網(wǎng)上的資料試了都不太行。

回答
編輯回答
扯不斷

//獲取到當前線程綁定的請求對象
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
//已經(jīng)拿到session,就可以拿到session中保存的用戶信息了。
System.out.println(request.getSession().getAttribute("userInfo"));

我猜樓主你是需要這個

2017年12月21日 02:37
編輯回答
舊城人

我發(fā)現(xiàn)其實不應該這樣做,與session有關的操作,應該放在能獲取到session的上下文中(如Controller中),而不應該放在一個單獨的線程中,大概是因為項目的線程和context無關,所以線程中無法獲取session。正確的做法應該是把和session有關的操作放到Controller中(或其他含有context的環(huán)境),再轉移到線程進行處理。

2017年8月27日 02:23