gpt4 book ai didi

c# - 当对 C# mvc Controller 的 ajax 调用不起作用时处理 session 超时

转载 作者:太空狗 更新时间:2023-10-29 19:51:35 24 4
gpt4 key购买 nike

从 ajax 调用函数时。程序流不识别过期的 session ,即不重定向到登录页面。取而代之的是,它保存了记录。我在 c# .net mvc 中工作。那么我如何在 ajax 调用时处理 session 。在这里,我给出了我的代码。

 $.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)
{
}
});

这里是 Controller

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

最佳答案

您的 AJAX 调用的结果仍可能最终显示为成功(尽管不用担心,它实际上不会执行您的操作方法),并调用您的 success 处理程序。这是因为您需要 HTML,而这正是您收到的(尽管生成的 HTML 可能是您的登录页面,而不是您想要的 HTML)。顺便说一句,如果您需要 JSON(使用 dataType:'JSON'),它会触发错误,因为它将 HTML 解析为 JSON。

您需要做的是防止 FormsAuth 重定向 AJAX 请求的登录页面。现在,AuthorizeAttribute 忠实地返回一个 NotAuthorizedResult,它向客户端发送 HTTP 401 未授权响应,这非常适合您的 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) 将您想要此行为的 Controller 或操作从使用 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;
...
...
...
}

关于c# - 当对 C# mvc Controller 的 ajax 调用不起作用时处理 session 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12703942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com