4

Guice サーブレット セッションの有効期限が切れたときに、 ServletContext内の項目にアクセスするアクションを実行する必要があります。(なぜですか?セッションを破棄するために開いている websocket 接続を通過し、それらを閉じるためです。これらの接続は に保持されますServletContext。)

基本的なサーブレット Web アプリケーションでこれを実現するには、HttpSessionListenerを実装し、メソッドにフックしsessionDestroyedます。

依存性注入にGoogle Guiceを使用する Web アプリケーションでこれを実現するにはどうすればよいでしょうか?

にアクセスできるという要件を思い出してくださいServletContextこのフォーラムでの会話は既に見ましたが、あまり役に立ちませんでした。

4

1 に答える 1

1

セッションリスナーを追加するための「ガイド方法」はありません。悲しいことに。ただし、セッション リスナーからサーブレット コンテキストにアクセスする場合は問題ありません。

セッション リスナーを登録します。

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

}

アクセス サーブレット コンテキストはセッション リスナーです。

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 に答える