授权过期后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页面凑效,也就是 ...
随机推荐
- SQLServer查询所有子节点
用CTE递归 ;with f as ( select * from tab where id=1 union all select a.* from tab as a inner join f as ...
- 如何看待那些不能重现的bug?
在我们日常测试活动中,经常会发现一些bug,但是这些bug可能就是昙花一现,再也无法(或者很难)重现出来,内心灰常崩溃.那到底有哪些方面可能会导致这类的缺陷发生呢? 我以自己工作中所遇到的给出一些自己 ...
- Controlling Session Behavior in Asp.Net MVC4
Posted By : Shailendra Chauhan, 06 Jan 2013 Updated On : 11 Jun 2014 By default, Asp.Net MVC support ...
- java IO 管道流PipedOutputStream/PipedInputStream
详情:管道流的具体实现 import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputS ...
- 如何创建JUnit
这里拿Dynamic项目来演示,首先创建一个Dynamic项目,起名,点next, 继续点next, 将web.xml文件勾选,finish, 接下来在Java Resources->src下创 ...
- MVC - Model - Controller - View
一. Model 1.1 在ASP.NET MVC 中 model 负责的是所有与 "数据“ 相关的的任务. 也可以把Model 看成是 ASP.NET 中三层模式的 BLL层 加 DA ...
- small cell 在安防领域的应用探讨
在安防领域,最核心的问题是:如何有效区分“内部人员”与“外部人员”.所谓“有效”包含两点意思,一是安全,尽可能地过滤出“外部人员”.二是效率,即尽可能无干扰地或较小干扰地使“内部人员”通过.所有的安全 ...
- switch case 判断是否为按钮、设置属性 Load Foreach 绑定事件
private void button9_Click(object sender, EventArgs e) { foreach (Control CT in this.Controls) {//判断 ...
- C# 文本输入限制类型,datagridview单元格输入验证
1.只能输入double类型 private void textBoxX6_KeyPress(object sender, KeyPressEventArgs e) { { //数字0~9所对应的ke ...
- c# 解析MP3文件
不说那么多,网上有很多关于MP3文件说明的. 该C#代码是将C\C++转化过来的,可能存在问题. 如有需要的朋友可以参考. 项目中的文件路径大家自己修改. 下载地址