授权过期后AJAX操作跳转到登录页的一种全局处理方式
前两天园友JustRun分享了一篇 《菜鸟程序员之Asp.net MVC Session过期异常的处理》博文,正好自己前段时间被安排处理过这个问题,发现JustRun的方法有一点点可优化的地方,就评论里提了一下思路。今天看到有园友好像没明白我说的意思,所以就决定写此博文简单介绍一下,不太适合老鸟们观看,权当是给新人写的一点经验分享。
什么问题
通常在对一些敏感数据进行操作前,都要进行身份认证。如果没有通过认证,则重定向(跳转)到登录页面。但这种服务端重定义的方式,对ajax请求却没有任何作用。本文就是给出一种全局处理方式,来解决这类问题。
如何解决
思路很简单,就是当授权过期后,针对ajax请求返回一个特定的标识,然后前端通过识别该标识,来跳转到登录页面。而且最好不用在每处ajax请求的代码中都加上对这种标识判断,即要能全局处理。所以目标就落在了jQuery.ajax的全局配置($.ajaxSetup)上了,通过查看API,发现statusCode参数用来做这件事再好不过了,而且重要的是,即使ajax代码中禁用了全局配置(global:false),关于statusCode的配置都仍然有效(这点对我们之前项目中来说很重要,因为有很多的ajax都禁用了全局的遮罩效果)。
代码演示
原理清楚了,代码实现起来也就并不复杂了,首先在服务端需要针对ajax请求,返回特殊的标识。这里重写了MVC自带的授权模块的HandleUnauthorizedRequest逻辑,未通过授权时,如果是ajax请求,则返回一个HttpStatusCode,这个值尽量不要与现有的HTTP状态码重复,我这里用的是499,然后将登录页的地址写到响应流中(这里可以根据需要返回其他信息)。自定义的授权模块代码如下:
public class WebAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new HttpStatusCodeResult(); //尽量不要与现有的Http状态码冲突
filterContext.HttpContext.Response.Write(FormsAuthentication.LoginUrl); //可以根据需要返回其他信息
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
然后就是前端部分的处理了,前端使用$.ajaxSetup的statusCode参数来统一处理,在模板页面中,写入以下代码:
<script type="text/javascript">
$.ajaxSetup({
statusCode: {
499: function (data) {
alert(data.responseText);
//window.location.href = data.responseText;
}
}
});
</script>
好了,所有的代码都完成了,下面进行简单的测试一下,服务端写了两个Action(这两个Action需要用上面写的授权模块),一个返回Time,一个返回Guid:
[WebAuthorize]
public ActionResult GetTime()
{
return Content(DateTime.Now.ToString());
} [WebAuthorize]
public ActionResult GetGuid()
{
return Content(Guid.NewGuid().ToString());
}
页面上写了两个ajax请求,分别请求以上两个Action:
<input id="Button1" type="button" value="GetTime" />
<input id="Button2" type="button" value="GetGuid" />
<script type="text/javascript">
$("#Button1").click(function () {
$.get("/Home/GetTime", function (data) {
$("body").append(data + '<br/>');
});
});
$("#Button2").click(function () {
$.ajax({
url: '/Home/GetGuid',
global: false, //禁用全局,不影响$.ajaxSetup中的statusCode
success: function (data) { $("body").append(data + '<br/>'); }
});
});
</script>
当然还要添加登录退出功能(这块代码就不贴了,见源码吧),在授权有效期内,运行效果如下:

这时,如果我们再打开一个新页面点退出(或直接把cookie删掉),再点击上面的GetTime或GetGuid按钮发送ajax请求,结果如下:

OK,达到预期效果。如有更优雅的处理方式,也请大家分享。DEMO使用VS2010+MVC3开发,源码请点此下载。
授权过期后AJAX操作跳转到登录页的一种全局处理方式的更多相关文章
- shiro session过期后ajax请求跳转(转)
配置了 Shrio框架,session也集成进去了 ,发现问题session会话过期,点击页面,一直请求失败.本来想集成拦截器,过滤器,但是已经用了shiro框架,sessionDestroyed 方 ...
- Spring Security登录超时,angular ajax请求出错自动跳转至登录页(jQuery也适用)
公司开发采用Spring Security+AngualerJS框架,在session过期之后,ajax请求会直接出错.本文介绍如何实现出错情况下自动跳转至登录页. 整体思路是,session过期后, ...
- 在Ubuntu登陆界面输入密码之后,黑屏一闪后,又跳转到登录界面
现象:在Ubuntu登陆界面输入密码之后,黑屏一闪后,又跳转到登录界面.原因:主目录下的.Xauthority文件拥有者变成了root,从而以用户登陆的时候无法都取.Xauthority文件.说明:X ...
- 后台跳转到登录页嵌套在iframe的问题(MVC例)
//首页 public ActionResult Index() { if (!Request.IsAuthenticated) //判断权限,没有登录就跳回登录页 {string url = Url ...
- SSM登录跳转到登录页,登录页不能加载js和样式
SSM登录跳转到登录页,登录页不能加载js和样式选用jsppage添加根路径. <% String rootPath = request.getContextPath(); %> < ...
- Spring security invalid-session-url 的坑(配了permitAll仍然跳转到登录页)
Spring security session配置中如果配了如下的invalid-session-url,配置了permitAll链接首次链接系统时会跳转到登录页,将该配置删除即可解决此问题. < ...
- 关于使用struts2时子窗体页面跳转后在父窗体打开的问题以及Session过期后的页面跳转问题
问题1:传统的系统界面,iframe了三个页面,上,左,右,用户点击注销的按钮在上面得top.jsp里面,方法:<a href="../adminAction/admin_logout ...
- 解决session过期跳转到登录页并跳出iframe框架(或者layui弹出层)
当用户长时间停留在管理界面没有操作,等到session过期后,进行了操作,那么只是iframe跳转到login页面,这不是我们想要的结果.解决方法:在login页面加一个逻辑判断: <scrip ...
- Asp.net MVC访问框架页中嵌套的iframe页面时,如果session或cookie过期,登录验证超时怎样自动跳转到登录页
一般登录验证的过滤器中,使用验证过滤器的Redirect方法,将请求重定向到指定的URL.但是如果我们要访问的页面是一个嵌套在框架页中的iframe页面时,这种重定向只会对iframe页面凑效,也就是 ...
随机推荐
- SQL语句学习积累·数据的操作
数据的操作 select 取表中前五条数据 select top 5 from table_name 取表中前50%的数据 select top 50 percent from table_name ...
- Linq学习<一>
lambda查询语法: var result =arrarylist.where(n=>n.contains("l")) 简化的委托方法实例 linq查询结构: var ...
- P1001
原创 问题描述: 当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法. 具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位, ...
- HackOne
使用 weight 属性实现视图的居中显示 一.在开发中有时候会遇到将一个控件在父控件居中显示.但是如果你直接用margin_*来进行限制的话就可能造成对于不同的型号的手机又不同显示的格式. 所以就可 ...
- 【转】.net 在线播放各类视频
原文地址:http://blog.csdn.net/hefeng_aspnet/article/details/9704857 一.后台拼字符串动态加载写法 前台调用代码 <!DOCTYPE h ...
- NET上传大文件出现网页无法显示的问题 默认的上传文件大小是4M
需要在配置文件处进行修改 web.config中的<system.web></system.web>内加入如下代码: <httpRuntime executionTime ...
- 「HEOI2016/TJOI2016」序列
题目链接 戳这 Solution 首先考虑最暴力的dp 我们设: \(f[i]\)表示选择\(i\)以后所能形成的满足条件的子序列的最大值 \(minx[i]\)表示\(i\)能转换为的最小值 \(m ...
- LNMP(linux+nginx+mysql+php)服务器环境配置【转载】
本文转载自 园友David_Tang的博客,如有侵权请联系本人及时删除,原文地址: http://www.cnblogs.com/mchina/archive/2012/05/17/2507102.h ...
- Django之跨域请求同源策略
同源策略: 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 而如果我们要跳过这个策略,也就是说非要跨域请求,那么就需要通过 ...
- Java面向对象之多态(向上、向下转型) 入门实例
一.基础概念 多态: 重点是对象的多态性.某一事物的多种体现形态. 多态的作用: 1.提高了代码的扩展性,后期出现的功能,可以被之前的程序所执行. 2.不能使用子类特有的功能.只能使用覆盖父类的功能. ...