千家信息网

.net mvc session失效怎么办

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍了.net mvc session失效怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。最近解决基于.net mvc
千家信息网最后更新 2026年11月01日.net mvc session失效怎么办

这篇文章主要介绍了.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请求,找到了另外一种方法

jQuery.ajaxSetup()

该函数用于更改jQuery中AJAX请求的默认设置选项。之后执行的所有AJAX请求,如果对应的选项参数没有设置,将使用更改后的默认设置。

因此我们的客户端代码可以这样统一处理:

//解析ajax请求session超时问题$.ajaxSetup({complete: function(xmlHttpRequest, textStatus) {var sessionStatus = xmlHttpRequest.getResponseHeader("sessionstatus");if (sessionStatus === "timeout") {_window.location = "/Login/Login";}}});

本以为到这里就万事大吉啦,结果一不小心又发现一个问题,基于.net mvc的jquery.unobtrusive-ajax封装的ajax请求调用,没有达到拦截处理的效果。经过反复调试无果,最终还是注意到上面那段话

jQuery.ajaxSetup()该函数用于更改jQuery中AJAX请求的默认设置选项。之后执行的所有AJAX请求,如果对应的选项参数没有设置,将使用更改后的默认设置。

这里说的比较明白了,那肯定就是jquery.unobtrusive-ajax封装的时候捣的鬼啦,翻开源码一看果然如此:

$.extend(options, {type: element.getAttribute("data-ajax-method") || undefined,url: element.getAttribute("data-ajax-url") || undefined,cache: !!element.getAttribute("data-ajax-cache"),beforeSend: function (xhr) {var result;asyncOnBeforeSend(xhr, method);result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(element, arguments);if (result !== false) {loading.show(duration);}return result;},complete: function (xhr,status) {loading.hide(duration);getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(element, arguments);},success: function (data, status, xhr) {asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html");getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(element, arguments);},error: function () {getFunction(element.getAttribute("data-ajax-failure"), ["xhr", "status", "error"]).apply(element, arguments);}});

我们看到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失效怎么办"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

权限 认证 处理 问题 结果 代码 封装 方法 篇文章 项目 客户 客户端 情况 源码 登录 怎么办 两个 事件 信息 函数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东万易互联网科技有限公司惠州分公司 互联网是第几次科技革命的成果 广州百单互联网科技有限公司 工业互联网科技新基建 互联网与科技发展 与互联网科技公司 互联网科技英文 腾讯科技 互联网女皇 亿账通互联网科技 万达互联网科技 互联网科技股有哪些 互联网科技扶贫时间 广东工业互联网大赛深圳学泰科技 广州互联网高科技取餐柜 新氧科技和美国互联网有关系吗 互联网科技平台产品运营 互联网科技机房 上海万顺科技互联网有限公司招聘 互联网领先科技成果宣传视频 互联网科技创业有什么好项目 互联网科技小贷 随着互联网科技发展 互联网科技与管理 昭通互联网科技选哪家 新兴科技互联网创新大赛颁奖典礼 辽宁互联网新科技 互联网科技创新的路径 郑州欣桑互联网科技有限公司 银川新华互联网科技学校是国营吗 北京品多多互联网科技有限公司
0