最近在研究有关.net mvc项目中的session失效问题,下面小编把研究过程给大家共享下,大家可以参考下。
最近解决基于.net mvc项目的session失效问题,这个跟大家聊聊。
1.问题分析
.net mvc中,Session失效需要考虑几种情况:
•基于权限认证的Action,使用非Ajax请求;
•基于权限认证的Action,使用JQueryt Ajax请求;
•基于权限认证的Action,使用.net mvc封装的Ajax请求;
•无权限认证的Action,使用非Aajx请求;
•无权限认证的Action,使用原生JQuery Ajax请求;
•无权限认证的Action,使用.net mvc封装的Ajax请求;
基于权限认证的Action,session失效后AuthorizeAttribute都可以拦截,并在HandleUnauthorizedRequest方法中处理;无权限认证的Action需要在自定义的filter中,根据新建Session与已请求Session的区别进行判断和处理。
2.基于权限认证的非Ajax请求
Authorize filter优先于其他功能过滤器执行,因此这里继承AuthorizeAttribue,在HandleUnauthorizedRequest中处理session请求。
public class AuthorizeOfHandleUnAuthorizeAttribute:AuthorizeAttribute{protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext){//session失效重定向到登录页面filterContext.Result =new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Login", Action = "Login" }));}}
3.基于权限认证的Ajax请求
Ajax请求的Action在系统中存在两种返回结果:JsonResult和PartialViewResult。
•JsonResult理论上可以通过在返回的结果上增加session超期属性,客户端进行判断即可。但是考虑到项目已经完成,在所有ajax请求上增加判断逻辑有些繁琐。
服务端代码处理ajax请求:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext){//ajax请求session超期处理if (filterContext.HttpContext.Request.IsAjaxRequest()){filterContext.HttpContext.Response.AppendHeader("sessionstatus","timeout");filterContext.HttpContext.Response.End();return;}filterContext.Result =new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Login", Action = "Login" }));}
客户端代码(这种处理方式对于返回结果为PartialViewResult的Action是不适用的):
onSuccess: function (xhr, status) {//获取响应头,sessionstatus,var sessionstatus = xhr.getResponseHeader("sessionstatus");if (sessionstatus == "timeout") {window.location = "/Login/Login";}}
•PartialViewResult情况的存在,直接否定上面的设想。项目中大部分Ajax请求都是基于.net mvc封装的,直接更新指定div。
为了不做大量更改、且统一处理两种返回结果的ajax请求,找到了另外一种方法
新闻热点
疑难解答
图片精选