asp.net-mvc – Asp.net MVC – 如何检查Ajax请求的会话过期
我们正在整个应用程序中使用Ajax调用 – 尝试在尝试执行任何Ajax请求时,如果会话已经过期,则尝试找到重定向到登录页面的全局解决方案.我已经编写了以下解决方案,从这篇文章中获取帮助 –
Handling session timeout in ajax calls
不确定为什么在我关心的事件中“HandleUnauthorizedRequest”没有被解雇. 自定义属性: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class CheckSessionExpireAttribute :AuthorizeAttribute { protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if (filterContext.HttpContext.Request.IsAjaxRequest()) { var url = new UrlHelper(filterContext.RequestContext); var loginUrl = url.Content("/Default.aspx"); filterContext.HttpContext.Session.RemoveAll(); filterContext.HttpContext.Response.StatusCode = 403; filterContext.HttpContext.Response.Redirect(loginUrl,false); filterContext.Result = new EmptyResult(); } else { base.HandleUnauthorizedRequest(filterContext); } } } 在控制器操作中使用Above自定义属性如下: [NoCache] [CheckSessionExpire] public ActionResult GetSomething() { } AJAX Call(JS部分): function GetSomething() { $.ajax({ cache: false,type: "GET",async: true,url: "/Customer/GetSomething",success: function (data) { },error: function (xhr,ajaxOptions,thrownError) { } } Web配置身份验证设置: <authentication mode="Forms"> <forms loginUrl="default.aspx" protection="All" timeout="3000" slidingExpiration="true" /> </authentication> 我尝试通过删除浏览器烹饪来检查它,然后进行ajax调用,但事件“CheckSessionExpireAttribute”没有被解雇 – 请任何想法. 谢谢, @保罗 解决方法
如果我的问题是正确的(即使我没有,无论如何,谢谢,帮助我解决了我自己的情况),你想要避免的是让你的登录页面加载到一个元素中,该元素应该显示不同的View via阿贾克斯.那个或在Ajax表单帖子中获取异常/错误状态代码.
因此,简而言之,注释类将需要覆盖2个方法,而不仅仅是HandleUnauthorizedRequest,它将重定向到JsonResult Action,它将为您的Ajax函数生成参数以了解要执行的操作. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,AllowMultiple = true,Inherited = true)] public class SessionTimeoutAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { IPrincipal user = filterContext.HttpContext.User; base.OnAuthorization(filterContext); if (!user.Identity.IsAuthenticated) { HandleUnauthorizedRequest(filterContext); } } protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { if (filterContext.HttpContext.Request.IsAjaxRequest()) { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "AccountController",action = "Timeout" })); } } } 然后在您的身份验证操作中设置此注释,因此每次调用它时,它都会知道请求的来源以及应该给出的返回类型. [AllowAnonymous] [SessionTimeout] public ActionResult Login() { } 然后你重定向的Json Action: [AllowAnonymous] public JsonResult Timeout() { // For you to display an error message when the login page is loaded,in case you want it TempData["hasError"] = true; TempData["errorMessage"] = "Your session expired,please log-in again."; return Json(new { @timeout = true,url = Url.Content("~/AccountController/Login") },JsonRequestBehavior.AllowGet); } 然后在你的客户端函数中(我有权将它写为$.get()而不是$.ajax(): $(document).ready(function () { $("[data-ajax-render-html]").each(function () { var partial = $(this).attr("data-ajax-render-html"); var obj = $(this); $.get(partial,function (data) { if (data.timeout) { window.location.href = data.url; } else { obj.replaceWith(data); } }).fail(function () { obj.replaceWith("Error: It wasn't possible to load the element"); }); }); }); 此函数使用此data-ajax-render-html属性替换html标记,该属性包含要加载的View地址,但您可以通过更改html()属性的replaceWith将其设置为在标记内加载. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- kendo-ui – 剑道多选控制 – 从下拉列表中删除所选项目
- asp.net – 如何防止用户多次投票?
- asp.net-mvc – 如何使用linq-to-sql将存储过程结果映射到自
- asp.net-mvc-4 – DataAnnotation的必需属性
- asp.net-mvc – ASP.NET的恶意抓取工具拦截器
- asp.net-mvc – 用于支持多种语言的ASP MVC技术
- asp.net菜单skiplink
- asp.net – 未处理的IIS异常 – 如何跟踪它
- .NET Core采用的全新配置系统[2]: 配置模型设计详解
- asp.net-mvc – 来自EDMX文件的MVC模型 – 为其添加自定义注
- asp.net – IIS如何知道它是服务于一个网站还是一
- asp.net-mvc – 我的CRUD LINQ代码在哪里? ASP.
- asp.net-mvc – 从子页面选择MVC中母版页上的右侧
- asp.net – MS Chart控件创建的临时文件应该放在
- asp.net-mvc – Robots.txt,禁止多语言URL
- iis-7 – ASP页面中的错误“80131509”
- asp-classic – 如何在经典的asp中读取文本文件
- asp.net-mvc – 设置debug = false实际导致远程S
- asp.net-mvc – EditorFor()和additionalViewDat
- asp.net-mvc – 在ASP.NET MVC中创建控件外的Vie