2016-08-18 1 views
1

J'utilise un serveur Tomcat intégré version 7. Je veux configurer par programme le serveur avec le mode de suivi de session (en fait, je cherche un moyen de se débarrasser de jsessionid ie ni dans les cookies ni dans l'url). Mais il n'y a pas de méthode dans org.apache.catalina.Context pour configurer simplement cette propriété comme dans un fichier descripteur web.xml (je ne peux pas utiliser un tel fichier). Alors, quelle est la meilleure façon de le faire?Comment configurer par programmation les modes de suivi de session pour Tomcat

J'ai essayé le code ci-dessus

Context ctxt = tomcat.addWebapp(.......); 
ctxt.getServletContext().setSessionTrackingModes(
     my_modes); 

Mais cette méthode a échoué avec l'erreur

java.lang.IllegalStateException: The session tracking modes for context/cannot be set whilst the context is running 
at org.apache.catalina.core.ApplicationContext.setSessionTrackingModes(ApplicationContext.java:1235) 
at org.apache.catalina.core.ApplicationContextFacade.setSessionTrackingModes(ApplicationContextFacade.java:611) 

J'ai essayé d'utiliser https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/Context.html#addApplicationListener(java.lang.String). L'auditeur sur contextInitialized définir le mode de suivi

servletContextEvent.getServletContext().setSessionTrackingModes(
     EnumSet.copyOf(sessionTrackingModes)); 

Mais je ne sais pas comment configurer tomcat avec une instance de cet écouteur parce qu'avec la dernière méthode Context.addApplicationListener la méthode prend le nom de classe de l'auditeur et lors de l'exécution du serveur ne parvient pas à instancier mon auditeur parce que l'absence d'un constructeur vide (mon constructeur auditeur prend la liste des sessionTrackingMode .. ne peut pas être configurable)

[read-1] ERROR Aug 18 19:10:03 - Error configuring application listener of class xx.xx.xx.SessionTrackingListener 
java.lang.InstantiationException: xx.xx.xx.SessionTrackingListener 
at java.lang.Class.newInstance(Class.java:427) 
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:125) 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4715) 
.............. 
Caused by: java.lang.NoSuchMethodException: xx.xx.xx.xx.SessionTrackingListener.<init>() 
at java.lang.Class.getConstructor0(Class.java:3082) 
at java.lang.Class.newInstance(Class.java:412) 

Alors proposez-vous une meilleure façon de le faire

+0

En général, consultez https://tomcat.apache.org/tomcat-7.0-doc/config/listeners.html pour configurer les écouteurs. La question que j'ai est pourquoi voudriez-vous vous débarrasser de jsessionid en premier lieu? C'est un aspect intégral des demandes de suivi faites par plusieurs utilisateurs et le conteneur a besoin de cette information pour fonctionner correctement. – Alan

+0

Parce que dans le côté serveur, j'utilise une implémentation de session interne personnalisée, pas une session HttpSession et il y a un autre cookie que j'ai ajouté pour identifier cette session entre les requêtes. Je n'utilise pas HttpSession – Jugu

Répondre

0

Utilisez un SessionTrackingListener. Le problème avec celui que vous utilisez est qu'il n'a pas de constructeur par défaut. Cela devrait fonctionner si vous y ajoutez un constructeur par défaut.

+0

Mais j'ai besoin d'utiliser le constructeur avec des arguments donc si j'ai ajouté un par défaut je vais avoir NPE – Jugu

+0

Vous ne pouvez pas. Comment le maillot est-il censé savoir ce qu'il faut passer lorsqu'il crée l'auditeur? Vous pouvez créer une nouvelle classe avec une méthode statique, qui renvoie les informations que vous souhaitez utiliser dans l'écouteur. Assurez-vous que cette information est disponible lorsque l'écouteur est créé. Puis appelez cette méthode dans l'écouteur pour récupérer l'information si nécessaire. – Guenther