AngularJS与ASP.NET MVC登录超时解决方案
问题:
1.在Action中判断Ajax请求的方法Request.IsAjaxRequest()始终是false
2.返回给前台StatusCode和HttpUnauthorizedResult,前台接收到的Status还是200,表示成功
解决解决方案:
1.查了一些资料后发现,后台判断是否Ajax请求是根据请求数据headers中的 X-Requested-With 来识别,按现说使用AngularJS$http服务请求应该会自动给加上才对啊(还有很多人反应使用jQuery也有此问题,我没去试,不知道是不是通病)。于是想办法在AngularJS所有Ajax请求之前都加上 X-Requested-With,这里使用$httpProvider.interceptors拦截的方式来做统一处理。
2.我后台使用的是ActionFilter方式统一处理需要校验登录,返回HttpUnauthorizedResult,但是前台接收到的status始终都是200。这里需要注意两点:a)需要手动设置Response的Status状态码; b)必须要在设置完成后执行Response.End()
前台请求、响应拦截器代码:
zmApp.config(function ($httpProvider) {
$httpProvider.interceptors.push(['$rootScope', '$q', '$location', '$timeout',
function ($rootScope, $q, $location, $timeout) {
return {
'request': function (config) {
//处理AJAX请求(否则后台IsAjaxRequest()始终false)
config.headers['X-Requested-With'] = 'XMLHttpRequest';
return config || $q.when(config);
},
'requestError': function (rejection) {
return rejection;
},
'response': function (response) {
return response || $q.when(response);
},
'responseError': function (response) {
console.log('responseError:' + response);
if (response.status === 401 || response.status === 403) {
abp.notify.error("会话超时,请重新登录!");
$timeout(function () { window.location = "/Login"; }, 3000);
return false;
}
else if (response.status === 500) {
$location.path('/error');
return false;
}
return $q.reject(response);
}
};
}]);
});
后台ActionFilter代码:
public class LoginAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContextBase context = filterContext.HttpContext;
HttpResponseBase response = filterContext.HttpContext.Response;
HttpRequestBase request = filterContext.HttpContext.Request;
if (context.Session["User"] == null)
{
if (request.IsAjaxRequest())
response.Status = "401 Session Timeout";
else
response.Redirect("/Login");
filterContext.Result = new HttpUnauthorizedResult();//这一行保证不再执行Action的代码
response.End();//必须加上这句,否则返回前台status始终是200
return;
}
base.OnActionExecuting(filterContext);
}
}
AngularJS与ASP.NET MVC登录超时解决方案的更多相关文章
- ABP示例程序-使用AngularJs,ASP.NET MVC,Web API和EntityFramework创建N层的单页面Web应用
本片文章翻译自ABP在CodeProject上的一个简单示例程序,网站上的程序是用ABP之前的版本创建的,模板创建界面及工程文档有所改变,本文基于最新的模板创建.通过这个简单的示例可以对ABP有个更深 ...
- AngularJS and Asp.net MVC
AngularJS 初印象------对比 Asp.net MVC 之前就早耳闻前端MVC的一些框架,微软自家的Knockout.js,google家的AngularJs,还有Backone.但未曾了 ...
- asp.net mvc cookie超时返回登录页面问题
filterContext.HttpContext.Response.Write("<script>top.location.href = '/Login/Index';< ...
- asp.net单点登录(SSO)解决方案
前些天一位朋友要我帮忙做一单点登录,其实这个概念早已耳熟能详,但实际应用很少,难得最近轻闲,于是决定通过本文来详细描述一个SSO解决方案,希望对大家有所帮助.SSO的解决方案很多,但搜索结果令人大失所 ...
- ASP.NET MVC 登录验证
好久没写随笔了,这段时间没 什么事情,领导 一直没安排任务,索性 一直在研究代码,说实在的,这个登录都 搞得我云里雾里的,所以这次我可能也讲得不是 特别清楚,但是 我尽力把我知道的讲出来,顺便也对自 ...
- ASP.NET MVC 多语言解决方案
1:打开VS,新建ASP.NET MVC4项目 2:创建一个放本地化资源的文件夹并命名为"Language",右键选择添加新项,选择资源文件并命名为"Com" ...
- 如何在 ASP.NET MVC 中集成 AngularJS(1)
介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...
- ABP 教程文档 1-1 手把手引进门之 AngularJs, ASP.NET MVC, Web API 和 EntityFramework(官方教程翻译版 版本3.2.5)含学习资料
本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 转载请注明出处:http://www.cnblogs.com/yabu007/ 谢谢 官方文档分四部分 一. 教程文档 二.ABP 框架 三. ...
- Angularjs 通过asp.net web api认证登录
Angularjs 通过asp.net web api认证登录 Angularjs利用asp.net mvc提供的asp.net identity,membership实现居于数据库的用户名/密码的认 ...
随机推荐
- MySql模糊查询like通配符简介
%代表随意多个字符 _代表一个字符 在 MySQL中.SQL的模式缺省是忽略大写和小写的 正则模式使用REGEXP和NOT REGEXP操作符. "."匹配不论什么单个的字符.一 ...
- "Cannot find entry symbol nable-stdcll-fixup; defaulting to 00401000" 解决方案
在使用Qt 4.7.3, Qt 4.7.2 ,Qt 4.7.1(mingw 4.6.2 )的时候都会有一个问题无法编译通过,即用Qt Creator 编译的时候会发生一个错误 "Cannot ...
- 更改Activity的最底层的布局
public void attachToActivity(Activity activity) { mActivity = activity; TypedArray a = activity.getT ...
- 【Java基金会】Java整理面试问题和评论(一)
1. ArrayList,Vector, LinkedList 存储性能及特点 ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便添加和插入元素,它们都 ...
- makefile知识点归纳的
以一个样例開始,文件文件夹结构例如以下 ---------(当前文件夹)-----------main.c | |------- ...
- Java模式(适配器型号)
今天阅读Java该适配器模式,这里有一个小的总结和下谈感受.对于将来使用. 首先.让我们有关适配器先说说. 适应是“来源”至“目标”适应.其中连接这两个的关系是适配器.它负责“源”过度到“目标”. 举 ...
- 图表引擎AChartEngine 一
MainActivity.java package com.example.achartengine0; import org.achartengine.ChartFactory; import or ...
- 文件搜索神器 Everything
Everything 是一款 NTFS 磁盘格式下的文件搜索工具,1月5日发布测试版本 1.3.0.631b Beta,增加文件列表.收藏夹.自定义快捷键.高级搜索等功能,取消了比较实用的 etp/f ...
- String、StringBuffer和StringBuilder
一.String和StringBuffer String类型和StringBuffer类型的主要性能差别事实上在于String是不可变的对象,因此在每次对String类型进行改变的时候事实上都等同于生 ...
- SDL2来源分析7:演出(SDL_RenderPresent())
===================================================== SDL源代码分析系列文章上市: SDL2源码分析1:初始化(SDL_Init()) SDL2 ...