2016-08-18 102 views
1

我正在使用嵌入式tomcat服务器版本7.我想以编程方式配置服务器与会话跟踪模式(实际上我搜索一种方法来摆脱jsessionid,即既在饼干或网址中)。 但是在org.apache.catalina.Context中没有方法来简单地配置这个属性,就像在一个web.xml描述符文件中一样(我不能使用这样的文件)。 那么最好的办法是什么?如何以编程方式配置Tomcat的会话跟踪模式

我想上面的代码

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

但这种方法与错误

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) 

我试图用https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/Context.html#addApplicationListener(java.lang.String)失败。在contextInitialized监听器设置跟踪模式

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

但我不知道如何与这个监听器的实例,因为最后的方法Context.addApplicationListener的方法需要监听的类名配置Tomcat和当运行服务器发生故障实例我的听众,因为没有一个空的构造的(我的听众构造函数采用sessionTrackingMode名单..不能配置)

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

所以,你的建议是一个更好的办法来做到这一点

+0

一般来说,请参阅https://tomcat.apache.org/tomcat-7.0-doc/config/listeners.html来设置侦听器。我的问题是为什么你想摆脱jsessionid首先?这是跟踪多个用户发出的请求和容器需要该信息正常工作的一个不可或缺的方面。 – Alan

+0

因为在服务器端我使用的是自定义的内部会话实现,而不是HttpSession,并且还有另外一个cookie,所以我在请求之间添加了这个cutom会话。我没有使用HttpSession – Jugu

回答

0

使用SessionTrackingListener。你使用的问题是它没有默认的构造函数。它应该工作,如果你添加一个默认的构造函数。

+0

但我需要使用带参数的构造函数,所以如果我添加了一个默认的函数,我将有NPE – Jugu

+0

你不能。球衣应该在创造监听器时知道要传入什么?您可以使用静态方法创建一个新类,该静态方法返回您想在侦听器中使用的信息。确保在创建侦听器时此信息可用。然后在侦听器中调用此方法以根据需要检索信息。 – Guenther