2017-04-06 26 views
0

Tomcatでシャットダウン時にセッションを維持しようとしています。私はすでにセッションに保存されているものはすべてシリアライズ可能であるという要件に注意しました。TomcatをEclipseで実行するとうまくいきます。コード変更によってEclipseがWebアプリケーションをリロードするとセッションが生き残ります。Tomcatセッションの逆シリアル化がClassNotFoundExceptionで失敗する

しかし、スタンドアローンのTomcatで同じことをしようとすると、問題が発生します。

$ {catalina.base} /conf/context.xmlのManager要素のコメントを解除し、パス名属性を$ {catalina.base} /SESSIONS.serに設定しました。シャットダウン時に、私はSESSIONS .serファイルが表示されます。ここまでは順調ですね。

しかし、私はTomcatを再起動すると、これはcatalina.outに表示されます。

[...] 
06-Apr-2017 13:39:52.570 SEVERE [localhost-startStop-1] org.apache.catalina.session.StandardManager.startInternal Exception loading sessions from persistent storage 
java.lang.ClassNotFoundException: com.mycompany.wtt.util.LogoutLogger 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285) 
[...] 
06-Apr-2017 13:39:54.158 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /data/tokken/apache-tomcat-8.5.12/webapps/wtt.war has finished in 1,134 ms 
[...] 

クラスcom.mycompany.wtt.util.LogoutLoggerがwtt.war Webアプリケーションの一部であり、明らかに、Tomcatがしようとしますwebappをロードする前にwebappのセッションを逆シリアル化します。これは、セッションにアプリケーション固有のクラスを置くことができないことを意味するように見えます。これは大きな問題です。なぜなら、私のロジックの中には、それを行うことができ、javax.servlet.http .HttpSessionActivationListener。

webappsをロードした後にTomcatのセッションを逆シリアル化する方法はありますか?

バージョン:Tomcat 8.5.12、Java 1.8.0_121。

答えて

0

Managerをグローバルパスcontext.xmlに絶対パスで設定していることが判明しました。これは、Tomcatがシリアライズされたセッションを読み込んだときに、そのWebAppがどのWebアプリケーションに属しているのかわからず、アプリケーション固有のクラスのために失敗したことを意味します。

${catalina.home}/conf/context.xmlを元の状態に戻し、Manager要素をコメントアウトして、代わりにをwebappのMETA-INF/context.xmlに追加することで、動作するようになりました。

pathname="SESSIONS.ser"と言っても、セッションはサーバーの再起動後も存続しますが、アプリケーションの再作成がアプリケーションの作業ディレクトリを破壊するため、セッションが相対パス名で保存されるため、アプリケーション再デプロイメントでは存続しません。 pathname="${catalina.home}/sessions/wtt.ser"と言っているのはこれを避けていますが(Tomcatがあなたのために作成しないため、あなたのセッションが書かれているディレクトリを事前に存在させることを確実にしてください)。

関連する問題