2016-08-18 59 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