Comment injecter des dépendances dans HttpSessionListener, en utilisant Spring?
-
19-09-2019 - |
Question
Comment injecter des dépendances dans HttpSessionListener, avec Spring et sans appel, comme context.getBean("foo-bar")
?
La solution
Depuis la ServletContext Servlet 3.0 a une méthode « addListener », au lieu d'ajouter votre écouteur dans votre fichier web.xml vous pouvez ajouter dans le code comme ceci:
@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");
}
}
}
ce qui signifie que vous pouvez injecter normalement dans le « MyHttpSessionListener » et avec cela, il suffit de la présence de la fève dans votre contexte d'application provoquerez l'auditeur à être enregistré avec le conteneur
Autres conseils
Vous pouvez déclarer votre HttpSessionListener
comme un haricot dans un contexte de printemps, et enregistrer un proxy de délégation comme auditeur réelle web.xml
, quelque chose comme ceci:
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);
}
...
}
Avec 4,0 Spring, mais fonctionne également avec 3, je mis en œuvre l'exemple détaillé ci-dessous, en écoutant ApplicationListener<InteractiveAuthenticationSuccessEvent>
et injecter le href="https://stackoverflow.com/a/19795352/2213375"> https HttpSession