2

Jetty のセッション永続性を機能させようとしています。実際にはセッションをディスクに書き込んでいますが、アプリケーションがセッションを読み取る機会を得るまでにセッション データがすべて消去されているため、セッションを読み戻していないようです。

次のように構成しています。

HashSessionManager sessionManager = new HashSessionManager();
sessionManager.setStoreDirectory(new File("sessions"));

// If I don't put in this next line, it seems like it "never" saves sessions to disk.
// Or at least I don't have the patience to wait however long it must take to do so.
sessionManager.setSavePeriod(5);//seconds

// Supposedly if you don't turn this on it can cause problems for some of the things
// Wicket puts in the session because Jetty would otherwise initialise the objects in
// the session before Wicket itself initialises.
sessionManager.setLazyLoad(true);

// ...
servletHandler.setSessionHandler(new SessionHandler(sessionManager));

ドキュメントには、遅延読み込みを有効にすることによって上記のコードで既にステップオーバーしたものを除いて、明らかな落とし穴については言及されていないようです。しかし、そのクラスには他にも多くのセッションがあり、それらのほとんどすべてが Javadoc で文書化されていないため、ソースコードを掘り下げて潜在的なバグを見つける以外に、ここからどこに行くべきかを知るのは困難です...

4

1 に答える 1

0

1日後に自分の質問に答えます。カスタムのキーと値のペアをセッションに追加しようとしたところ、それがセッションに正常に保持されていることがわかりました。そうしているうちに、セッション ファイルのサイズが着実に大きくなっていることに気付きました。これは、サーバーが再起動されるたびにセッション全体がパージされているように見える場合は特に異常に思えます。

そこで、すべてのセッション データをダンプするコードを書いたところ、Wicket がセッション内に次のように複数の値を持っていることがわかりました (ここまでたどり着いた時点で、キーと値のペアは約 10 倍多くありました)。

Wicket:SessionUnbindingListener-com.acme.server.web.DispatcherServlet-1037224009=org.apache.wicket.session.HttpSessionStore$SessionBindingListener@5b3ab386
Wicket:SessionUnbindingListener-com.acme.server.web.DispatcherServlet-1306414591=org.apache.wicket.session.HttpSessionStore$SessionBindingListener@33048394
ぐらつき=ぐらつき
ウィケット:com.acme.server.web.DispatcherServlet-1037224009:session=com.acme.server.webui.ServerWebUISession@30e97557
wicket:com.acme.server.web.DispatcherServlet-1037224009:wicket:persistentPageManagerData - com.acme.server.web.DispatcherServlet-1037224009=org.apache.wicket.page.PageStoreManager$SessionEntry@20e39570
ウィケット:com.acme.server.web.DispatcherServlet-1306414591:currentUser=com.acme.server.auth.DefaultServerUser@2f16bbd7[id=2,name=admin,roles=[admin, user]]
wicket:com.acme.server.web.DispatcherServlet-1306414591:roles=admin、ユーザー
ウィケット:com.acme.server.web.DispatcherServlet-1306414591:session=com.acme.server.webui.ServerWebUISession@6b8cb5cd
wicket:com.acme.server.web.DispatcherServlet-1306414591:wicket:persistentPageManagerData - com.acme.server.web.DispatcherServlet-1306414591=org.apache.wicket.page.PageStoreManager$SessionEntry@517d59d0

これにより、「com.acme.server.web.DispatcherServlet-1037224009」をワイルドに検索しました。サーブレットの getServletName() の値であることが判明しました。getServletName() の Javadoc には、サーブレット名がサーブレットのクラス名になると書かれていますが、Jetty の場合は実際にはそうではありません。最後にある種の乱数も追加されます。したがって、Wicket がサーブレット名をセッション キーに入れ、Jetty が API ドキュメントに従ってサーブレット名を生成しないという Jetty + Wicket の特異性であることが判明しました。

もちろん、この修正は、ディスパッチャ サーブレットの既知の名前を設定するワンライナーでした。

于 2012-05-03T04:56:07.923 に答える