7

ajaxから関数を呼び出す場合。プログラムフローは期限切れのセッションを認識しません。つまり、ログインページにリダイレクトしません。その代わりに、レコードを保存します。私はc#.netmvcで作業しています。では、ajax呼び出し中にセッションを処理するにはどうすればよいですか?ここで私は私のコードを与えました。

 $.ajax({ 
            type: "POST",
            url:'/Employee/SaveEmployee',
            data:
            {
                Location:$("#txtLocation").val(), 
                dateApplied:$("#txtDateApplied").val(), 
                Status:$("#ddStatus").val(), 
                mailCheck:$("#ddMailCheck").val(),
                ...
                ...
                ... 
            },
            success: function (result) 
            {

            },
            error: function (msg) 
            {
            }
      });

ここにコントローラー

[Authorize]
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...)
{
      objEmpMain.FirstName = firstName;
      objEmpMain.LastName = lastName;
      objEmpMain.Initial = Initial;
      objEmpMain.Address1 = Address;
      ...
      ... 
      ...
} 
4

2 に答える 2

24

AJAX 呼び出しの結果はおそらく成功したように見え (ただし、アクション メソッドが実際に実行されるわけではありません)、successハンドラーを呼び出します。これは、HTML を期待しているためであり、それを受け取っているためです (ただし、結果の HTML はログイン ページであり、必要な HTML ではない可能性があります)。余談ですが、( を使用してdataType:'JSON') JSON を期待すると、HTML を JSON として解析するため、エラーが発生します。

FormsAuth が AJAX リクエストのログイン ページをリダイレクトしないようにする必要があります。をAuthorizeAttribute忠実に返しNotAuthorizedResult、クライアントに HTTP 401 Not Authorized 応答を送信します。これは、AJAX クライアントにとって理想的です。

問題は、FormsAuth モジュールが StatusCode をチェックし、401 の場合はリダイレクトを実行することです。私はこの問題に次のように対処しました。

AuthorizeAttribute1) 認証が失敗したことを知らせるフラグを配置する独自の派生型を作成HttpContext.Itemsし、リダイレクトではなく 401 を強制する必要があります。

public class AjaxAuthorizeAttribute : AuthorizeAttribute
{
    /// <summary>
    /// Processes HTTP requests that fail authorization.
    /// </summary>
    /// <param name="filterContext">Encapsulates the information for using <see cref="T:System.Web.Mvc.AuthorizeAttribute"/>. The <paramref name="filterContext"/> object contains the controller, HTTP context, request context, action result, and route data.</param>
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest()) filterContext.HttpContext.Items["AjaxPermissionDenied"] = true;

        base.HandleUnauthorizedRequest(filterContext);
    }
}

2) Global.asax.cs に追加します。

    protected void Application_EndRequest(Object sender, EventArgs e)
    {
        if (Context.Items["AjaxPermissionDenied"] is bool)
        {
            Context.Response.StatusCode = 401;
            Context.Response.End();
        }
     }

3) statusCode ハンドラーを jQuery AJAX セットアップに追加します。

$.ajaxSetup({
    statusCode: {
        401: function() {
            window.location.href = "path/to/login";
        }
    }
});

4)この動作を使用するコントローラーまたはアクションを次のように変更しAuthorizeAttributeますAjaxAuthorizeAttribute

[AjaxAuthorize]
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...)
{
      objEmpMain.FirstName = firstName;
      objEmpMain.LastName = lastName;
      objEmpMain.Initial = Initial;
      objEmpMain.Address1 = Address;
      ...
      ... 
      ...
} 
于 2012-10-03T08:05:44.260 に答える