2016-08-18 6 views
1

Ich verwende einen eingebetteten Tomcat-Server Version 7. Ich möchte den Server mit dem Session-Tracking-Modus konfigurieren (in der Tat suche ich einen Weg, um jsessionid dh weder zu beseitigen in den Cookies noch in der URL). Aber es gibt keine Methode in org.apache.catalina.Context, um diese Eigenschaft einfach wie in einer web.xml-Deskriptordatei zu konfigurieren (ich kann solche Datei nicht verwenden). Also, was ist der beste Weg, es zu tun?Wie konfiguriere ich programmatisch die Session-Tracking-Modi für Tomcat

habe ich versucht, den obigen Code

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

Aber diese Methode mit dem Fehler fehlgeschlagen

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) 

Ich versuchte https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/Context.html#addApplicationListener(java.lang.String) zu verwenden. Der Hörer auf contextInitialized stellen Sie den Tracking-Modus

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

Aber ich weiß nicht, wie Kater mit einer Instanz dieses Zuhörer zu konfigurieren, da mit der letzten Methode Context.addApplicationListener das Verfahren den Klassenname des Hörers nimmt und wenn der Server läuft nicht meine Zuhörer instanziiert, weil das Fehlen eines leeren Konstruktor (meine Zuhörer Konstruktor die Liste der sessionTrackingMode nimmt .. kann nicht konfigurierbar sein)

[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) 

So schlagen Sie einen besseren Weg, es zu tun

+0

Im Allgemeinen finden Sie unter https://tomcat.apache.org/tomcat-7.0-doc/config/listeners.html zum Einrichten von Listenern. Die Frage, die ich habe, ist warum möchten Sie Jsessionid in erster Linie loswerden? Es ist ein wesentlicher Aspekt beim Verfolgen von Anfragen, die von mehreren Benutzern durchgeführt wurden, und der Container benötigt diese Informationen, um ordnungsgemäß zu funktionieren. – Alan

+0

Weil ich auf der Serverseite eine benutzerdefinierte interne Sitzungsimplementierung verwende, keine HttpSession, und es gibt noch weitere Cookies, die ich hinzugefügt habe, um diese Cutom-Sitzung zwischen Anfragen zu identifizieren. Ich benutze nicht HttpSession – Jugu

Antwort

0

Verwenden Sie einen SessionTrackingListener. Das Problem mit dem, das Sie verwenden, ist, dass es keinen Standardkonstruktor hat. Es sollte funktionieren, wenn Sie einen Standardkonstruktor hinzufügen.

+0

Aber ich muss den Konstruktor mit Argumenten verwenden, also wenn ich eine Standard-Ised habe ich NPE – Jugu

+0

Sie können nicht. Wie soll Trikot wissen, was bei der Erstellung des Listeners passieren soll? Sie können eine neue Klasse mit einer statischen Methode erstellen, die die Informationen zurückgibt, die Sie im Listener verwenden möchten. Stellen Sie sicher, dass diese Informationen verfügbar sind, wenn der Listener erstellt wird. Rufen Sie dann diese Methode im Listener auf, um die Informationen dort abzurufen, wo sie benötigt werden. – Guenther

Verwandte Themen