4

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

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

对于使用Google Guice进行依赖注入的 Web 应用程序,如何实现这一点?

回想能够访问的要求ServletContext;我已经遇到过这个论坛对话,但没有发现它有帮助。

4

1 回答 1

1

没有添加会话侦听器的“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();
    }
}
于 2015-04-01T07:56:26.787 回答