以前在写登录Action过滤时,都在每个Controller前写上CheckLoginAttribute;这次决定偷懒试一下能否将所有Action和Controller统一过滤;

开始代码是这样式儿的:

1.新建一个特性类,继承ActionFilterAttribute,在Action执行前判断是否有登录记录Session,则在OnActionExecuting(ActionExecutingContext filterContext)中判断未登录,则返回登录界面;

  public class LoginAttribute:ActionFilterAttribute
{ public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext); if (filterContext.HttpContext.Session["useruid"] == null)
{
filterContext.Result = new RedirectResult("/Home/Login");
return;
} }
}

2.在App_Start文件夹里的FilterConfig.cs,添加LoginAttribute

 public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new LoginAttribute());//新增登录特性
}
}

运行后,网页如下图,清除cookie完全无效。

查找问题原因:单步调试后,发现RegisterGlobalFilters中的filters.Add(new LoginAttribute())  和 LoginAttribute中的RedirectResult,都会执行多次,次数和什么有关呢?

  在运行到LoginAttribute前,曾经在定义Controller的依赖注入UnityContainer里晃了一圈,重复执行RedirectResult的次数和容器注入的类数有关,先执行到依赖注入再执行到OnActionExecuting,应该是在Action操作之前,先对所有Controller依赖构造器接口进行初始化操作,初始化操作涉及到各个Controller。

  再看RegisterGlobalFilters初始化是属于Global.asax.cs,用于对全局文件配置的,在每执行一次Controller中的Action,都会执行一次LoginAttribute。于是初始化所有Controller依赖注入接口期间,有触发LoginAttribute。RouteConfig配置Home\Login为默认启动Action。所以,在启动Home\Login后,在初始化Controller的依赖注入后会连续多次执行RedirectResult(“/Home/Login“”),导致程序并没报错,而浏览器崩溃。

于是这样改了试试:

  public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext); //增加对初始化/Home/Login判定,直接跳出,避免多次执行RedirectResult
string url = filterContext.HttpContext.Request.Url.ToString();
if (url.IndexOf("Home") > &&url.IndexOf("Login")>)
{
return;
}
//增加部分到此结束 if (filterContext.HttpContext.Session["useruid"] == null)
{
filterContext.Result = new RedirectResult("/Home/Login");
return;
}
}

然后暂时解决了。在各位大神帮忙指正下,添加标签的方式然后根据标签判断,比判断关键字符串,更便于扩展维护。

最后代码如下:

 public class LoginAttribute:ActionFilterAttribute
{ public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//判断Action描述标签中是否有AllowAnonymous特性
if(filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true))
{
return;
} if (filterContext.HttpContext.Session["useruid"] == null)
{
filterContext.Result = new RedirectResult("/Home/Login");
return;
}
base.OnActionExecuting(filterContext); }
}

MVC过滤器之添加LoginAttribute,浏览器bug:重定向次数太多的更多相关文章

  1. asp.net core MVC 过滤器之ActionFilter过滤器(二)

    本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core ...

  2. asp.net core MVC 过滤器之ExceptionFilter过滤器(一)

    简介 异常过滤器,顾名思义,就是当程序发生异常时所使用的过滤器.用于在系统出现未捕获异常时的处理. 实现一个自定义异常过滤器 自定义一个异常过滤器需要实现IExceptionFilter接口 publ ...

  3. MVC过滤器之 OnActionExcuted

    Controller里 [SendMessage] public Action SendSmsMessage() { var resultExtendInfo=new ResultExtendInfo ...

  4. asp.net core MVC 全局过滤器之ExceptionFilter异常过滤器(一)

    本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter异常过滤器(一) asp.net cor ...

  5. 2017.3.31 spring mvc教程(六)转发、重定向、ajax请求

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  6. Fiddler-004-配置过滤器之-域名过滤

    前文讲述了通过 Fiddler 进行网络抓包的一个小实例,具体敬请参阅博文: 有些细心的小主可能发现了,我们捕获的 HTTP请求 中有一些请求不是我们需要的,而是一些非必要数据,页面如下图所示:

  7. 介绍一款自动给添加不同浏览器CSS3前缀的插件~Autoprefixer(附其他前端开发插件)

    正文 自动给CSS文件添加不同浏览器的CSS3前缀:Autoprefixer 安装 只需兼容主流浏览器 正常情况使用:(在书写完的CSS样式文件中,按F1,选择Autoprefixer CSS) 这时 ...

  8. IE浏览器Bug总结

    每每在网上搜索IE浏览器Bug时,总是骂声一片,特别是前端工程师,每天都要面对,IE浏览器特别是IE6,存在很多Bug,对Web标准的支持也拖后腿,但不可否认,IE浏览器是曾经的霸主,它的贡献也是巨大 ...

  9. Vue项目添加动态浏览器头部title

    0. 直接上 预览链接 + 效果图 Vue项目添加动态浏览器头部title 1. 实现思路 ( 1 ) 从路由router里面得到组件的title ( 2 ) title存vuex (本项目已经封装h ...

随机推荐

  1. hdu2059 龟兔赛跑 DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059 虽然 知道是DP ,刚开始一直没有想出状态转移方程. 刚开始的思路就是定义dp[i]表示到达第i ...

  2. NIO原理剖析与Netty初步----浅谈高性能服务器开发(一)

    除特别注明外,本站所有文章均为原创,转载请注明地址 在博主不长的工作经历中,NIO用的并不多,由于使用原生的Java NIO编程的复杂性,大多数时候我们会选择Netty,mina等开源框架,但理解NI ...

  3. VR全景是市场价值及前景

    消费者视角痛点:比如酒店消费行业,很多消费者在预订酒店过程中,都遇到过这样的场景:网上照片里酒店房间看着宽敞明亮,格调不凡,感觉非常喜欢,等真正推开房门插上房卡一看,却大失所望.在酒店行业,网上照片和 ...

  4. Java Class Loader

    Reference: [1] http://www.cnblogs.com/kevin2chen/p/6714214.html 当调用 java命令运行一个java程序时,会启动一个java虚拟机进程 ...

  5. 《Android进阶》之第四篇 ViewPagerIndicator的使用

    1.先将这个开源框架下载到本地: Administrator@QH-20141231RFQJ /d/hixin $ cd ViewPagerIndicator/ Administrator@QH-20 ...

  6. 前端魔法堂:屏蔽Backspace导致页面回退

    前言  前几天用户反映在录入资料时一不小心错按Backspace键,就会直接回退到是一个页面,导致之前辛辛苦苦录入的资料全部丢失了.哦?居然还有这种情况.下面我们来一起探讨一下吧! Windows系统 ...

  7. elasticsearch系列(四)部署

    本文采用tar包的方式部署es 准备jdk8的环境 5.4.0的es依赖jdk8及以上版本 下载linux版的jdk jdk-8u121-linux-x64.tar.gz tar -zvxf jdk- ...

  8. spring service层单元测试

    service层测试较简单,目前大多数测试主要是针对public方法进行的.依据测试方法划分,可以分为两种:基于mock的隔离测试和基于dbunit的普通测试. mock隔离测试 配置pom.xml ...

  9. 开源解析库 - JSON

    Json及其实现 JSON作为一种轻量级的数据交换格式,多被用于跨语言通信(比如CPP与PHP之间的数据交互). 至于何为JSON,其详细解释参考 官网. 既然是一种格式,那便必然有相应的编码实现.在 ...

  10. 【JAVAEE学习笔记】hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户

    今日学习:hibernate是什么 一.hibernate是什么 框架是什么: 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架 ...