26

如何将依赖项注入 HttpSessionListener,使用 Spring 而无需调用,例如context.getBean("foo-bar")

4

3 回答 3

30

由于 Servlet 3.0 ServletContext 有一个“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 在您的应用程序上下文中存在,就会导致侦听器注册到容器中

于 2013-01-02T22:17:35.090 回答
8

您可以HttpSessionListener在 Spring 上下文中将您的 bean 声明为 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);
    }

    ...
}
于 2010-03-12T14:41:35.670 回答
1

使用 Spring 4.0 但也适用于 3,我实现了下面详述的示例,监听ApplicationListener<InteractiveAuthenticationSuccessEvent>并注入HttpSession https://stackoverflow.com/a/19795352/2213375

于 2015-07-01T16:02:30.767 回答