Logout...

 ログイン制のアプリだとログアウトなボタンを付けたくなりますよね、利用していたセッション情報を破棄して繋がりを無くそうとするヤツ。WebObjectsにもWOSessionクラスにterminate()という名前のメソッドが用意されていますので、普通にMainを返すコンポーネントアクションを

public WOComponent logout() {
    WOComponent nextPage = pageWithName("Main");
    session().terminate();

    return nextPage;
}

 とかやってしまいたくなります。
 実行してみますと一見上手く動いている様ですが、表示されたページのWOHyperlinkやWOFormのアクションにはセッション情報が含まれてしまっていて、そのアクションがコンポーネントアクションだったりすると、クリック後にエラーページを返されてしまいます(←この場合問題になるのはセッションIDではなくコンテキストIDなので、ダイレクトアクションであればエラーページにはならない)。
 それを回避するには、「ログアウトしました。」みたいなページを間に挿んで、そのページに初期状態を返す様なダイレクトアクションのリンク(←defaultActionとか)を仕込んでおくのが一般的だとおもうのですが、もう一歩すすめて「直接適当なページを返しちまおうぜ」って随分と前にWO系MLに流れていたのが今回の元ネタです(←色々と検証するのが面倒で書きかけのまま放置していたのを、今頃になって掘り起こしてみた)。

 やり方としては、セッション情報を持たないページを生成してリダイレクトしてやるという感じで、キーが“wosid”で“false”の値を持つNSDictionaryをWORedirectへ渡すのがミソですね。defaultActionを返す、logoutActionというDirectActionの実装例だと

public WOActionResults logoutAction() {
    session().terminate();
    WORedirect page = new WORedirect(context());
    page.setURL(context().directActionURLForActionNamed("default", new NSDictionary(Boolean.FALSE, "wosid")));

    return page;
}

 みたいな感じ。

 まぁ、こうやって生成したページでも、セッション機能を利用している場合には放置される事で有効期限が切れてしまうので、元の木阿弥だったりもしますが。