web-dev-qa-db-ja.com

Springを使用して依存性をHttpSessionListenerに注入する方法は?

Springを使用し、context.getBean("foo-bar")のように呼び出しなしで、依存性をHttpSessionListenerに注入する方法は?

25

サーブレット3.0ServletContextには「addListener」メソッドがあるため、web.xmlファイルにリスナーを追加する代わりに、次のようなコードを使用して追加できます。

@Component
public class MyHttpSessionListener implements javax.servlet.http.HttpSessionListener, ApplicationContextAware {

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (applicationContext instanceof WebApplicationContext) {
            ((WebApplicationContext) applicationContext).getServletContext().addListener(this);
        } else {
            //Either throw an exception or fail gracefully, up to you
            throw new RuntimeException("Must be inside a web application context");
        }
    }           
}

つまり、通常どおり「MyHttpSessionListener」に挿入できます。これにより、アプリケーションコンテキストにBeanが存在するだけで、リスナーがコンテナに登録されます。

27
Yinzara

SpringコンテキストでHttpSessionListenerをBeanとして宣言し、委任プロキシをweb.xmlの実際のリスナーとして次のように登録できます。

public class DelegationListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent se) {
        ApplicationContext context = 
            WebApplicationContextUtils.getWebApplicationContext(
                se.getSession().getServletContext()
            );

        HttpSessionListener target = 
            context.getBean("myListener", HttpSessionListener.class);
        target.sessionCreated(se);
    }

    ...
}
8
axtavt

Spring 4.0で動作しますが、3でも動作します。以下に詳述する例を実装し、ApplicationListener<InteractiveAuthenticationSuccessEvent>をリッスンし、HttpSessionを挿入しました https://stackoverflow.com/a/19795352/2213375

1
Teixi