2012-10-04 63 views
3

當Guice Servlet會話到期時,我需要執行一個操作,該操作將訪問ServletContext中的項目。 (?爲什麼要經過打開的WebSocket連接的會話被破壞和關閉它們。這些連接都保存在ServletContextGoogle Guice web應用程序中的HttpSessionListener

要在基本Servlet的Web應用程序實現這一點,將實施HttpSessionListener和鉤入sessionDestroyed方法。

對於依賴注入使用Google Guice的Web應用程序,如何實現此目的?

回想一下要求能夠訪問ServletContext;我已經遇到this forum conversation,但沒有覺得它有幫助。

回答

0

沒有'Guice way'來添加會話監聽器。可悲的是。但從會話偵聽器訪問servlet上下文沒有問題。

註冊會話監聽器:

public class MyServletConfig extends GuiceServletContextListener { 
    private Injector injector; 

    @Override 
    public void contextInitialized(final ServletContextEvent servletContextEvent) { 
     injector = Guice.createInjector(new MyAppModule()); 

     registerSessionListeners(servletContextEvent.getServletContext(), injector); 

     super.contextInitialized(servletContextEvent); 
    } 

    private void registerSessionListeners(final ServletContext servletContext, final Injector injector) { 
     servletContext.addListener(injector.getInstance(WebsocketCloser.class)); 
    } 

    @Override 
    protected Injector getInjector() { 
     return injector; 
    } 

} 

訪問servlet上下文是會話監聽器:

public class WebsocketCloser implements HttpSessionListener { 
    @Override 
    public void sessionCreated(final HttpSessionEvent httpSessionEvent) { 
     // no-op 
    } 

    @Override 
    public void sessionDestroyed(final HttpSessionEvent httpSessionEvent) { 
     // do cleanup: httpSessionEvent.getSession().getServletContext(); 
    } 
} 
相關問題