7

タペストリーを Spring Security と組み合わせて使用​​し、プロトタイプ以外に jQuery ライブラリを使用して Web アプリケーションを構築しています。セッションのタイムアウト後にユーザーがリンクをクリックすると、ログイン ページに自動的にリダイレクトされます。もちろん、これは AJAX リクエストをトリガーするリンクには機能しません。

これは、あらゆる種類の Web アプリケーションに共通の問題です (例: http://www.openjs.com/articles/ajax/session_timeout.php )。Tapestry 5 のベスト プラクティス ソリューションはありますか?

編集 次の解決策(ヘニングのおかげ)は私にとってはうまくいきます:

Ajax.Responders.register(
{
    onException: 関数()
    {
        window.location.reload();
    }
});

AJAX 呼び出し中にエラーが発生した場合、ページのリロードがトリガーされ、その結果、ログイン ページにリダイレクトされます。まだ調整が必要ですが (リダイレクトの代わりにエラー メッセージを表示するなど)、Ajax.Responders基本的には を使用するのが良い方法のようです。

4

3 に答える 3

5

Prototypeを使用するAJAXの場合、 AJAX.Respondersを使用してAJAXの失敗に反応するグローバルリスナーを追加できます。jQueryには、使用できるAjaxイベントと呼ばれる同様の構造があります。

両方のイベントハンドラーは、403エラーでログインページにリダイレクトする必要があります。この機能を使用してミックスインを作成し、レイアウトコンポーネントに追加することができます。

また、AJAX呼び出しを実行し、数分ごとに空の応答を受信して​​セッションを開いたままにすることで、アプリがブラウザーウィンドウで開いているときにセッションのタイムアウトを防ぐメカニズムも使用しました。愚かですが、大丈夫です。

于 2010-09-17T07:25:16.573 に答える
3

T5 マスター ディスパッチャに貢献できます


public class AjaxAccessController implements Dispatcher {

    @Override
    public boolean dispatch(Request request, Response response) throws IOException {

        // Si no hay session y la petición es ajax, recargar la página
        Session session = request.getSession(false);
        if (session == null && request.isXHR()) {
            OutputStream os = response.getOutputStream("application/json;charset=UTF-8");
            os.write("{\"script\":\"window.location.reload();\"}".getBytes());
            os.flush();
            return true;
        }

        return false;
    }
}

AppModule.java で


public static void bind(ServiceBinder binder) {
        // binder.bind(MyServiceInterface.class, MyServiceImpl.class);
        // Make bind() calls on the binder object to define most IoC services.
        // Use service builder methods (example below) when the implementation
        // is provided inline, or requires more initialization than simply
        // invoking the constructor.

        // Id de AjaxAccessController
        binder.bind(AjaxAccessController.class).withId("AjaxAccessController");
    }

public void contributeMasterDispatcher(
            OrderedConfiguration configuration,
            @InjectService("AjaxAccessController") Dispatcher accessController) {

        configuration.add("AjaxAccessController", accessController, "before:ComponentEvent");
    }

したがって、セッションなしの ajax リクエストごとに、ページがリロードされ、インデックス ページにリダイレクトされます。

于 2010-10-08T10:12:35.267 に答える
0

さて、Ajaxリクエストがサーバーに対して行われ、ヘッダー「HTTP_X_REQUESTED_WITH」と値「XMLHttpRequest」が送信されます。インデックスページでさらに進む前に、上記のヘッダーとログインおよびセッションタイムアウトの条件を備えたajaxリクエストであるかどうかをサーバー側で確認できます。

基準が一致した場合は、関数で「window.top.location.href='login page'」を出力するだけです。

PHPでは、これを次のように行うことができます。

<?php if($_SERVER['HTTP_X_REQUESTED_WITH'] === "XMLHttpRequest" && condition for session check){
    echo "<script>window.top.location.href='login.php'</script>";
    }

?>

フレームワークに同様の条件を追加できます。

于 2010-09-17T07:31:10.867 に答える