2016-12-05 32 views
0

有一類:如何從一個類中獲取會話對象?

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); 

那麼,有沒有辦法讓session(HttpSession中)對象:

@Configuration 
@ComponentScan("com.ambre.pta") 
@EnableTransactionManagement 
@PropertySources({ 
    @PropertySource("classpath:fr/global.properties"), 
    @PropertySource("classpath:fr/main.properties"), 
    @PropertySource("classpath:fr/admin.properties"), 
    @PropertySource("classpath:fr/referentiel.properties"), 
    @PropertySource("classpath:fr/departement.properties"), 
    @PropertySource("classpath:fr/exercice.properties"), 
    @PropertySource("classpath:fr/defi.properties") 
}) 
public class ApplicationContextConfig { 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer properties() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

    @Bean(name = "viewResolver") 
    public InternalResourceViewResolver getViewResolver() { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setPrefix("/WEB-INF/views/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 

    @Bean(name = "dataSource") 
    public DataSource getDataSource() { 

     BasicDataSource bds = new BasicDataSource(); 

     bds.setDriverClassName("oracle.jdbc.driver.OracleDriver"); 
     bds.setUrl("jdbc:oracle:thin:@localhost:1521:xe"); 

     bds.setUsername("pta"); 
     bds.setPassword("pta"); 

     return bds; 

    } 

    @Autowired 
    @Bean(name = "sessionFactory") 
    public SessionFactory getSessionFactory(DataSource dataSource) { 

     LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource); 

     sessionBuilder.scanPackages("com.ambre.pta.model"); 

     return sessionBuilder.buildSessionFactory(); 

    } 

    @Autowired 
    @Bean(name = "transactionManager") 
    public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) { 

     HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory); 

     return transactionManager; 

    } 

    @Autowired 
    @Bean(name = "utilisateurDao") 
    public UtilisateurDAO getUtilisateurDao(SessionFactory sessionFactory) { 
     return new UtilisateurDAOImpl(sessionFactory); 
    } 

} 

我們可以通過這種方式得到這個類中request對象?

+2

_唐」這樣做。但如果你堅持:'request.getSession()'... – zeroflagL

+0

request.getSession()。setAttribute我設置了一些屬性。在下一個url命中session.getAttribute變爲null。任何想法 – Deepak

回答

2

使用控制器類

您可以定義HttpSession作爲參數傳遞給你的控制器方法:

@RequestMapping("/my-path") 
public String doStuff(HttpSession session) { 
    // do stuff... 
} 

這也是訪問HttpRequest,而不是通過RequestContextHolder要推薦的方式,因爲它更容易模擬出測試的會話。

the Spring MVC docs for more detail.

不使用控制器類

另一種選擇是使用@SessionScope豆,並相應地發生變異它:

@Component 
@SessionScope 
public class MySessionScopedBean { 
    String attribute; 
} 

public class MyOtherClass { 
    @Autowired 
    private MySessionScopedBean myBean; 

    public void doStuff() { 
     // myBean accesses a bean instance isolated in the user session 
     myBean.attribute = "test"; 
    } 

} 
+0

但我有一個特殊的需要訪問非控制器類中的會話! – pheromix

+0

具體來說,你需要從會話中獲得什麼? – kewne

+1

哎呀,不小心張貼。 如果你需要保持某種用戶會話狀態,我的建議是創建一個'@ SessionScope' bean。 這樣,您可以將它注入到非控制器bean中。 – kewne

1

如果你想訪問一個控制器方法外HttpSession中,有兩個可能的答案:

  1. 不要這樣做,它是邪惡的。
  2. 如果你真的想這樣做(我已經做了,在過去,所以我是誰怪你),那麼最簡單的方法是寫一個類來保存會話,並攔截設置並取消它。但是,爲了方便起見,我將用HttpServletRequest的對象時,您可以從中提取會話:「如何從類中獲取一般會話對象」

    public class RequestHolder { 
    
        private static final ThreadLocal<HttpServletRequest> REQUEST = 
              new ThreadLocal<>(); 
    
        public static HttpServletRequest getCurrentRequest() { 
         return REQUEST.get(); 
        } 
    
        public static HttpSession getCurrentSession() { 
         HttpServletRequest request = REQUEST.get(); 
         return request == null ? null : request.getSession(); 
        } 
    
        public static void setCurrentRequest(HttpServletRequest request) { 
         REQUEST.set(request); 
        } 
    
        public static void unsetCurrentRequest() { 
         REQUEST.remove(); 
        } 
    
    } 
    
    public class RequestHolderInterceptor implements HandlerInterceptor { 
        @Override 
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) { 
         RequestHolder.setCurrentRequest(request); 
         return true; 
        } 
    
        @Override 
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView mav) { 
        } 
    
        @Override 
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e){ 
         RequestHolder.unsetCurrentRequest(); 
        } 
    } 
    
相關問題