Как внедрить зависимости в HttpSessionListener, используя Spring? - PullRequest
24 голосов
/ 12 марта 2010

Как внедрить зависимости в HttpSessionListener, используя Spring и без вызовов, как context.getBean("foo-bar")?

Ответы [ 3 ]

27 голосов
/ 03 января 2013

Поскольку 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», и с этим просто присутствие компонента в контексте вашего приложения приведет к тому, что слушатель будет зарегистрирован в контейнере

8 голосов
/ 12 марта 2010

Вы можете объявить свой HttpSessionListener как bean-компонент в контексте Spring и зарегистрировать посредник делегирования в качестве фактического слушателя в 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);
    }

    ...
}
1 голос
/ 01 июля 2015

В Spring 4.0, но также работает с 3, я реализовал пример, подробно описанный ниже, слушая ApplicationListener<InteractiveAuthenticationSuccessEvent> и вводя HttpSession https://stackoverflow.com/a/19795352/2213375

...