分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

菜鸟程序员之Asp.net MVC Session过期异常的处理

发布时间:2023-09-06 01:14责任编辑:赖小花关键词:MVC

一, Session引发的异常

小赵刚进公司,就参与到了一个实际的项目中了,项目使用的是Asp.net MVC。花了大概2个周的时间,小赵就完成了所有功能,提交给QA测试了。

过了一天,QA发回了测试结果,小赵过了一遍,发现原来自己做的东西,里面问题这么多。

其中一个bug是这样的:

使用Firefox登录进入系统后,再打开一个Tab,进入系统页面,点击logout. 在回到前一个tab页面,点击Save按钮,出现了js错误。这个时候应当将用户转到登陆页。

小赵看到这个bug,有些目瞪口呆,没想到QA用这么"暴力"的方式来测试自己的程序。在另一个Tab上点击logout, 会导致session清空的,这样再点击第一个tab上的Save按钮,调用的Ajax方法会出现异常的。

但是如何处理这种”非正常”操作引发的异常呢?

二,使用MVC中的Filter来对Session进行验证

小赵查了查资料,发现MVC中的AuthorizationFilter能够在实际访问Controller前,拦截请求,这个时候在这里可以对Session的有效性进行检查,如果发现Session失效了,就把用户转向登陆页。(关于MVC filter可以点这里)

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter{ ?????public void OnAuthorization(AuthorizationContext filterContext) ?????{ ??????????var loginUser = filterContext.HttpContext.Session["User"]; ??????????//When user has not login yet ??????????if (loginUser == null) ??????????{ ??????????????var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url; ??????????????filterContext.Result = new RedirectResult(redirectUrl); ??????????????return; ??????????} ?????}}

三,对于Ajax请求的中,Session失效的处理

Ajax请求中,如果遇到session过期,使用上面的方法是不能够达到效果的。实现的思路是,如果发现是Ajax请求,就返回特定格式的Json数据,客户端对于这个数据进行处理,发现有Session失效的情况,就跳转到登录页面。

首先,扩展我们的MyAuthorizeAttribute

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter{ ?????public void OnAuthorization(AuthorizationContext filterContext) ?????{ ??????????var loginUser = filterContext.HttpContext.Session["User"]; ??????????//When user has not login yet ??????????if (loginUser == null) ??????????{ ??????????????var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url; ??????????????????????????????if(!filterContext.HttpContext.Request.IsAjaxRequest()) ??????????????{ ??????????????????filterContext.Result = new RedirectResult(redirectUrl); ??????????????} ??????????????else ??????????????{ ?????????????????filterContext.Result = new JsonResult ????????????????????????????????????????{ ??????????????????????????????????????????????Data = new ??????????????????????????????????????????????{ ??????????????????????????????????????????????????Success = false, ??????????????????????????????????????????????????Message = string.Empty, ??????????????????????????????????????????????????Redirect = redirectUrl ????????????????????????????????????????} ??????????????}; ??????????} ??????????return; ?????}}

上面判断如果请求是来自于Ajax, 就返回一个Json Result,客户端处理的代码如下:

 $.ajax({ ???????????type: "POST", ???????????url: "@Url.ContactInfoAjax()", ???????????success: function (msg) { ?????????????????????if (msg.Success) { ?????????????????????????????……. ??????????????????????????????????????} ?????????????????????if (msg.Redirect) { ????????????????????????window.location = msg.Redirect; ?????????????????????} ???????}});     


另一种方式
//ajax
                if (context.Request.IsAjaxRequest())
                {
                    //http://www.jeasyui.com/forum/index.php?topic=584.0
                    //http://www.iteye.com/problems/70335
                    //直接返回403,然后客户端判断,并添加SessionTimeout头
                    context.Response.AddHeader("SessionTimeout""true");
                    filterContext.Result = new HttpStatusCodeResult(403, "您没有该权限,请登录!");
                    return;
                }

在客户端,使用jquery捕获错误
1
2
3
4
5
$(document).ajaxError(function (event, jqXHR) {
                if (jqXHR.status === 403 && jqXHR.getResponseHeader(‘SessionTimeout‘) === ‘true‘) {
                    window.top.location.href = ‘@Url.Action("LogIn", "Home")‘;
                }
            });

菜鸟程序员之Asp.net MVC Session过期异常的处理

原文地址:http://www.cnblogs.com/sjqq/p/7608904.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved