2

仲間の友人の助けを借りて、このトピックから問題の解決策を見つけることができました:一度に1人のユーザーがアカウントを使用できるようにする再利用可能な方法

シングル ログイン コードを再利用できるようにするために、AuthorizeAttribute から継承し、カスタム AuthorizeCore メソッドを実装する SingleLogin クラスがあります。

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool isAuthorized = base.AuthorizeCore(httpContext);

        if (isAuthorized)
        {
            int userId = (int)WebSecurity.CurrentUserId;
            using (var db = new UsersContext())
            {
                if ((httpContext.Session.SessionID != db.getSessionId(userId))
                    || db.getSessionId(userId) == null)
                {
                    WebSecurity.Logout();
                    isAuthorized = false;
                    httpContext.Response.Redirect("/Home/Index");
                }
            }
        }

        return isAuthorized;
    }

JsonResult アクションを除いて、すべて正常に動作します。

    [HttpPost]
    public JsonResult MessageSave(string message)
    {
        bool messageSaved = false;
        int userId = (int)WebSecurity.CurrentUserId;
        message = HttpUtility.HtmlEncode(message);

        // Model method - adding chat log - db
        db.addChatLog(message, userId);
        messageSaved = true;

        return Json(new { messageSaved = messageSaved });
    }

このメソッドは、以下のコード例で確認できる Ajax POST 呼び出しによってトリガーされます。基本的な POST だけです。

編集 3 これらの画像を確認してください: http://imgur.com/a/Cjael ..うーん、POST がトリガーされると思いますが、$.ajax の前にテストしようとすると、アラートが機能しない理由がわかりません...応答でわかるように、ホーム/インデックスページを取得しますが、すぐにホーム/インデックスにリダイレクトされません (テキストはテキストボックス内にとどまり、ページは待機するだけです..)、リダイレクトするにはもう一度Enterキーを押す必要があります..非常に奇妙な。

EDIT2 ログアウトしても jQuery にアクセスできないようです。.js ファイル内にいくつかのアラートを入れました。

別の .js ファイルがあり、それをビューに として配置します<script src="~/Scripts/custom/homeChat.js"></script>。View から HTML5 データを介して JS ファイルに Razor の値を渡します。

textBox 要素 #txtMsg が jQuery イベントをトリガーするため、ログアウトすると、おそらく textBox 要素が認識されなくなり、jQuery イベントがトリガーされませんか?

ビューで .js をトリガーする要素は次のとおりです。 @Html.TextBox("txtMsg")

JS:

$("#txtMsg").keypress(function (e) {

        //when enter
        if (e.which == 13) {
            alert("ALERT DOESNT TRIGGER");

                $.ajax({
                    type: "POST",
                    url: url,
                    data: JSON.stringify({ message: input }),
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (data) {
                        if (data.messageSaved) {
                            $("#txtMsg").val("");
                        }
                        else {
                            window.location.href = urlhome;
                        }
                    }
                });
            }
        }
    });

では、イベントに参加することさえできない場合、何か問題が発生したことをどうやって知ることができますか? 私はこれを持っていますが、私が正しく理解していれば、これが機能するためにjQueryイベント(私の場合は上記のjsコードの.keypress˙HandleUnauthorizedRequest )に入ることができる必要があります。

編集:追加説明

それでは、シナリオを説明しましょう。Firefox からユーザー名「john」でログインし、chrome からユーザー名「john」で再度ログインすると、Firefox で次のアクションを実行すると、ログアウトされてホーム/インデックスにリダイレクトされます。これは、他の誰かが Chrome で新しいログインを行ったためです。 .

それは大丈夫です。もうログインしていないため、アクションが通常の ActionResult でビューを返す場合、ホーム/インデックスに通常どおりリダイレクトされます。

私が抱えている問題は、ページにAjax POSTを使用する他の機能があり、ログアウトしているため、そのJsonResultアクションにPOSTできないため、リダイレクトするエラーのコールバックを受け取ることさえできないことですホーム/インデックスへ。私は自分の JS にいくつかのアラートを入れましたが、そのページではもう許可されていないため、通常のアラート トリガーはありません。onEnter テキスト ボックスでホーム/インデックスにリダイレクトされるようにするには、Enter キーを 2 回押す必要があります。できることはそれだけですか?

このAJAXの問題に対する最善のアプローチに興味があります。どのように呼べばよいのかわかりませんが、前のトピックから読んだように、「AJAX タイムアウトの処理」と呼ばれていますか?

どうもありがとうございました。

4

2 に答える 2

2

この方法でAJAXリクエストのエラーを処理できます

$.ajax({
    type: "POST",
    url: url,
    data: JSON.stringify({ message: input }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        if (data.messageSaved) {
            $("#txtMsg").val("");
        }
        else {
            window.location.href = urlhome;
        }
    },
    error: function(xhr, status, error) {
        // TODO: may be check error or status or xhr.statusCode()
        window.location.href = urlhome;
    }
});

jQuery$.ajax()ドキュメント

于 2013-08-09T13:07:37.493 に答える