Google Guice Web应用程序中的HttpSessionListener

时间:2012-10-04 20:29:39

标签: java servlets dependency-injection guice servlet-listeners

我需要执行一个操作,当Guice Servlet会话到期时,该操作将访问ServletContext中的项目。 (为什么?要通过打开的websocket连接来销毁会话并关闭它们;这些连接保存在ServletContext中。)

要在基本的Servlet Web应用程序中实现这一点,可以实现HttpSessionListener并挂钩sessionDestroyed方法。

如何使用Google Guice进行依赖注入的Web应用程序实现此目的?

回顾能够访问ServletContext的要求;我已经遇到this forum conversation,但没有发现它有用。

1 个答案:

答案 0 :(得分:0)

添加会话侦听器没有“Guice方式”。可悲的是。但是从会话侦听器访问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();
    }
}