2016-08-18 11 views
1

私は組み込みのTomcatサーバーバージョン7を使用しています。セッショントラッキングモードでサーバーをプログラムで構成したいのですが(実際にはjsessionidを取り除く方法クッキーにもURLにも)。 org.apache.catalina.Contextには、web.xml記述子ファイル(このようなファイルは使用できません)のようにこのプロパティを設定するだけの方法はありません。 それを行う最善の方法は何ですか?Tomcatのセッショントラッキングモードをプログラマチックに設定する方法

Iは、上記のコード

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

を試みたが、この方法は、私はhttps://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/Context.html#addApplicationListener(java.lang.String)を使用しようとしたエラー

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) 

で失敗しました。 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ではなくカスタムの内部セッションの実装を使用していますので、リクエスト間にこのcutomセッションを識別するために追加した別のクッキーがあります。私はHttpSessionを使用していません – Jugu

答えて

0

SessionTrackingListenerを使用します。あなたが使用している問題は、デフォルトのコンストラクタがないことです。デフォルトのコンストラクタを追加するとうまくいくはずです。

+0

しかし、私は引数を持つコンストラクタを使用する必要がありますので、デフォルトのものを追加した場合はNPEを持ちます – Jugu

+0

できません。ジャージーはリスナーを作るときに何を渡すべきかを知っておくべきですか?静的メソッドを使用して新しいクラスを作成し、リスナーで使用する情報を返します。この情報は、リスナーが作成されたときに使用可能であることを確認してください。次に、このメソッドをリスナーで呼び出し、必要に応じて情報を取得します。 – Guenther

関連する問題