これは仕様によるものです。POSTアクションの結果、同じビューへのポストバックではないナビゲーションが発生した場合にのみ、すぐに破棄されます(つまり、アクションメソッドが返されないか、null
または、空の場合でもvoid
十分に価値がString
あります)。
は<h:link>
、POSTアクションを呼び出さないGETリンクを生成します。ビューがアンロードされたときに(XML)HTTP要求によってサーバー側に通知することは確実に不可能であるため、ビューに関連付けられたビュースコープのBeanを破棄するようにJSFに通知することはできません。このような場合、ビュースコープBeanは、セッションが期限切れになるか、セッションの最大論理ビュー(デフォルトは15)を超え、関連付けられたビューが最初に表示された場合にのみ破棄されます。
ナビゲーションアクションによってビュースコープのBeanを本当に破棄したい場合は、代わりにPOSTリクエストを作成し、パラメータを使用<h:commandLink>
してナビゲーション結果を返すことでリダイレクトを発行するのが最善の策です。?faces-redirect=true
しかし、ボットはPOSTリンクのインデックスを作成しないため、これは結局SEOに適していません。
結局のところ、私はビューがまだセッションにあることを気にしません。クリーンアップやロギングを行う場合は、具体的な機能要件に応じて、別の方法を探します。
理論的にはHTMLDOMonbeforeunload
イベントによって可能になりますが、これは非標準のイベントであり、そのイベント中にajaxリクエストを送信したときに何が起こるかについてブラウザーの動作は指定されていません。到着することもありますが、到着しないこともあります。
更新:実際には、これはOmniFaces2.2@ViewScoped
以降OmniFacesに実装されています。最初は同期XHRの助けを借りて、そしてOmniFaces2.6以降はビーコンの助けを借りて。主要なブラウザで非常にうまく機能しています。OmniFaces 2.3以降は、関連するJSFサーバー側のビュー状態を即座に破棄し、OmniFaces 2.6以降は、物理Beanも即座に破棄するため、不要なメモリ使用量がさらに削減されます。特にJSF:Mojarra vs. OmniFaces @ViewScoped:@PreDestroyが呼び出されましたが、Beanをガベージコレクションすることはできません。