我们看到jquery.unobtrusive-ajax注册了ajax请求的compelete事件,因此我们写的默认处理程序就被覆盖啦。实在没想到什么好办法,只好改下jquery.unobtrusive-ajax的源码了:
complete: function (xhr,status) { loading.hide(duration); //解析ajax请求session超时问题 var sessionStatus = xhr.getResponseHeader("sessionstatus"); if (sessionStatus === "timeout") { window.location = "/Login/Login"; } getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(element, arguments); },
至此,基于认证的ajax请求session失效问题基本解决,存在两个瑕疵:
•修改了jquery.unobtrusive-ajax的源码,总感觉心里别扭;
•任何注册了compelete事件的ajax请求,都需要自己处理session问题。
4.无权限任务的Action
无权限认证的Action的Session失效问题,处理代码如下:
if (filterContext.HttpContext.Session != null) { if (filterContext.HttpContext.Session.IsNewSession) { var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"]; if (sessionCookie != null&&sessionCookie.IndexOf("ASP_NET_SessionId",StringComparison.OrdinalIgnoreCase)>=0) { filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary(new { Controller = "Login", Action = "Login" })); } } }
无权限认证的Action的Ajax可以仿照上面有权限认证的处理方法处理,这里就不再粘代码啦。个人感觉,无权限认证的Action请求,大多可以不用考虑session失效情况,因为这些Action大多不从session里获取信息,只是做公共信息的查询。
5.遗留问题
至此问题基本解决,但是过程中遇到了一个莫名其妙的问题,暂且记下:
我原本通过在配置文件把session超期时间设置的很小来模拟session失效,结果发现项目现有框架总会莫名奇妙的在登录后的第一个业务请请求时把session超期时间改为60分钟,没有找到为什么。后来只能通过在同一个浏览器打开两个tab页,登录系统后,在一个tab页推出的方法模拟。
以上所述是小编给大家介绍的.net mvc session失效问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章: