我正在使用嵌入式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)
所以,你的建议是一个更好的办法来做到这一点
一般来说,请参阅https://tomcat.apache.org/tomcat-7.0-doc/config/listeners.html来设置侦听器。我的问题是为什么你想摆脱jsessionid首先?这是跟踪多个用户发出的请求和容器需要该信息正常工作的一个不可或缺的方面。 – Alan
因为在服务器端我使用的是自定义的内部会话实现,而不是HttpSession,并且还有另外一个cookie,所以我在请求之间添加了这个cutom会话。我没有使用HttpSession – Jugu