7

从 ajax 调用函数时。程序流程不识别过期会话,即不重定向到登录页面。取而代之的是,它保存了记录。我在 c# .net mvc 中工作。那么我如何在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)。顺便说一句,如果您期望 JSON(使用dataType:'JSON'),它会触发错误,因为它将 HTML 解析为 JSON。

您需要做的是防止 FormsAuth 重定向 AJAX 请求的登录页面。现在,AuthorizeAttribute忠实地返回 a NotAuthorizedResult,它向客户端发送 HTTP 401 Not Authorized 响应,这对于您的 AJAX 客户端来说是理想的。

问题是 FormsAuth 模块检查 StatusCode,如果它是 401,它会执行重定向。我以这种方式解决了这个问题:

1)创建我自己的派生类型,在AuthorizeAttribute其中放置一个标志,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) 将您希望使用此行为的控制器或操作更改AuthorizeAttributeAjaxAuthorizeAttribute

[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 回答
1

我想建议您使用 StatusCode = 306。我在使用 401 时遇到了一些问题。IIS 对待 401 的方式与我理解的不同。306对我来说很好用。

问候。

于 2013-06-05T08:53:55.947 回答