2016-12-05 9 views
0

クラスがあります:一般に、クラス内からセッションオブジェクトを取得する方法は?

@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オブジェクトを取得することができます

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

のでsession(HttpSessionの)オブジェクトを取得する方法はありますか?

+2

_ _ドン」:しかし、物事をより簡単に、私はあなたがセッションを抽出することができ、そこからのHttpServletRequestオブジェクトを扱うことにしますそれをしないでください。しかし、あなたが主張するなら: 'request.getSession()' ... – zeroflagL

+0

request.getSession()。setAttribute私はいくつかの属性を設定します。次のURLでsession.getAttributeがnullになります。任意のアイデア – Deepak

答えて

2

使用して、コントローラクラス

あなたは、コントローラのメソッドの引数としてHttpSessionを定義することができます。

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

これはむしろRequestContextHolderを経由するよりも、HttpRequestにアクセスするための推奨方法は、それが簡単だからでもありますテストのためにセッションを模擬する。 、

@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にアクセスする場合:

は、コントローラクラス

別のオプションは、@SessionScope豆を使用し、それに応じて、それを変異することですを使用しないthe Spring MVC docs for more detail.

を参照してください。可能な答えは2つあります。

  1. しないでください、それは悪です。
  2. あなたが本当にそれをやりたいのであれば(過去にやっているので、誰があなたを責めているのですか)、最も簡単な方法は、セッションを保持するクラスとインターセプタを設定することです設定を解除します。 「クラスの中から、一般的にセッションオブジェクトを取得するにはどのように?」

    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(); 
        } 
    } 
    

関連する問題