1

認証に Sprint Security を使用する Grails アプリケーションを作成しています。非アクティブのために自動的にログオフされたユーザーにメッセージを表示する必要があります。

私のアプリケーションは、AJAX 要求とコントローラーへの直接要求の両方を使用します。AJAX リクエストの場合、Sprint Security はコード 401 の HTTP レスポンスを返すことに気付きました。デフォルトの URL マッピングを次のように再定義しました。

class UrlMappings {
    static mappings = {
         // ...

         "401" (controller: 'errors', action: 'inactivityLogout')
    }
}

inacticityLogout()メソッドの本体は次のとおりです。

def inactivityLogout() {
    log.debug("the user is logged out due to inactivity")
    session.setAttribute('inactivityMessage', "You have been logged out due to inactivity.")
    render(status: 401)
}

次に、属性が設定されているLoginControllerかどうかを確認inactivityMessageし、ログイン ページに対応するメッセージを表示します。

問題は、このソリューションが AJAX 呼び出しに対しては正常に機能することですが、アプリケーションの直接リンクをクリックするだけで別のページに移動しようとすると機能しません。2 番目のケースでは、ログが空であるため、メソッドinactivityLogoutは呼び出されません。

Firebug は、アプリケーションがコード 302 Moved Temporarily を返すことを示しているので、これが理由だと思います。しかし、その後、AJAX 呼び出しでも同じコードが返されることに気付きました。したがって、AJAX リクエストと非 AJAX リクエストの違いと、最後のリクエストが Grails URL マッピング エンジンによって処理されない理由がわかりません。

現在のソリューションの何が問題なのですか? この問題は、まったく別の方法で解決できますか?

ありがとう!

4

2 に答える 2

2

jQueryを使用して、これは私がしていることです:

$.ajaxSetup({
   statusCode: {
     401: function () {
       $('#ajaxAuthModal').modal('show');
     }
   }
});

すべての ajax リクエストが 401 を処理するように、グローバル JS ファイルにそれを持っています。次に、ユーザーに再度ログインする必要があることを伝えるモーダルを表示します。あなたが望むものを達成するために必要な唯一の本当の違いは、ajax を介して安全なリソースをポーリングすることです。これにより、401 が返されたときに 401 関数をトリガーできます。

jQuery などのほとんどの JavaScript ライブラリには、$.ajaxSetup().

于 2013-01-09T19:01:05.520 に答える
1

はい、アイデアはユーザーの操作なしでメッセージを表示することです。システムからログオフされた理由をユーザーに知らせたいだけです。

したがって、基本的に、ユーザーがページをロードすると、サーバーとの接続はありません。サーバーは、メッセージをブラウザに「プッシュ」することはできません。したがって、JavaScriptを使用したアクティブなセッションがあるかどうかを確認する必要があります。あなたはタイマーでこれをかなり簡単に行うことができます。

main.gspで、javascript変数をに設定します${session.maxInactiveInterval}。これにより、ユーザーセッションの最大長が得られます。開始するだけsetTimeout( function() { /* code to display to the user here */ }, maxInterval)です。

ページはリロードされていないため、リセットされないため、AJAX呼び出しの間隔をリセットすることを忘れないでください。

ちなみに、URLマッピングは、ページがリロードされておらず、ページを表示するものがないため、AJAX以外のリクエストでのみ機能する必要があります。@GreggがAJAXリクエストを処理するために使用しているようなものを使用する必要があります。

于 2013-01-10T04:55:29.740 に答える