Как внедрить зависимости в HttpSessionListener, используя Spring?
-
19-09-2019 - |
Вопрос
Как внедрить зависимости в HttpSessionListener, используя Spring и без вызовов, например context.getBean("foo-bar")
?
Решение
С сервлета 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", и при этом простое присутствие компонента в контексте вашего приложения приведет к тому, что слушатель будет зарегистрирован в контейнере
Другие советы
Вы можете заявить о своем HttpSessionListener
в качестве компонента в контексте 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);
}
...
}
С Spring 4.0, но также работает с 3, я реализовал пример, подробно описанный ниже, прослушав ApplicationListener<InteractiveAuthenticationSuccessEvent>
и вводя HttpSession
https://stackoverflow.com/a/19795352/2213375