1

JSF2.0でウィンドウクローズ時にセッションを無効化したい。だから私はそれを行うために以下のコードを書きました:

 var preventUnloadPrompt;
 var messageBeforeUnload = "my message here - Are you sure you want to leave this page?";
 $('a').live('click', function() {
    preventUnloadPrompt = true;
 });
 $('form').live('submit', function() {
    preventUnloadPrompt = true;
 });
 $(window).bind("beforeunload", function(e) {
    var rval;
    if (preventUnloadPrompt) {
        return;
    } else {
        // return messageBeforeUnload;
        doInvalidate();
    }
    return rval;
 });

function doInvalidate()
{
     $.ajax({
         url: "http://localhost:8080/MyPrj/SessionTimeout",
         type: 'GET'
     });
 }

そして私のサーブレットは以下の通りです:

 public class SessionTimeout extends HttpServlet {
    .....
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.err.println("IN SESSION TIMEOUT GET!!!");
            FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
   }
  .....
}

最初の JSF2.0 ページを起動した後 (この時点で FacesContext が初期化されている必要があります)、ウィンドウを閉じようとしました。SessionTimeoutサーブレットが呼び出されているのがわかりますが、FacesContext.getCurrentInstance().getExternalContext().invalidateSession();スローしていNullPointerExceptionます。なぜそれが起こっているのですか?FacesContextサーブレットでこの AJAX 呼び出し中に見えませんか? 上記が不可能な場合、他のアプローチを提案できますか?

4

1 に答える 1

3

FacesContextによって作成されるためFacesServlet、 によって要求が処理された場合にのみ使用できますFacesServlet。つまり、マネージド Bean、フェーズ リスナーなどの JSF アーティファクトでのみ使用できますが、JSF から独立して呼び出される「プレーン バニラ」サーブレットでは使用できません。

JSFが「隠れて」使用しているように、標準のサーブレットAPIメソッドを使用するだけです(ご存知のとおり、JSFはサーブレットベースのMVCフレームワークFacesServlet です。サーブレットです!)。セッションを無効にするには、行っているのとまったく同じことを行うだけですExternalContext#invalidateSession()

request.getSession().invalidate();
于 2013-02-03T20:13:28.007 に答える