最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。

十年河东十年河西,莫欺少年穷

学无止境,精益求精

   最近在做自学MVC,遇到的问题很多,索性一点点总结下。

写过webForm项目的童鞋都知道,在执行Page_Load()之前,会执行:OnInit(EventArgs e),那么在MVC中,在执行Action方法之前,会执行什么呢?在执行MVC Action之后,又会执行什么呢?下面给出答案:

1、OnActionExecuting  在执行操作方法之前由 MVC 框架调用。

2、OnActionExecuted  在执行操作方法后由 MVC 框架调用。

3、OnResultExecuting  在执行操作结果之前由 MVC 框架调用。

4、OnResultExecuted  在执行操作结果后由 MVC 框架调用。

根据上述,我们可以看出,在执行Action方法之前,MVC会执行OnActionExecuting()方法,这个方法在控制器中并没有展示给我们,需要我们进行重写。

下面以程序为例进行说明:

namespace WeiXinApi.Controllers
{
//统一授权验证
[Authorize(Roles = "admins")]
public class MangerController : Controller
{
public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
{
if (true)
{
//执行相关操作
//................一般执行如下操作................
//读取用户登录信息,获取用户权限
//MVC Form验证是通过Cookies实现的,因此在此处读取Cookies 并作验证
}
else
{
//如果验证失败,则返回登陆页
filterContext.HttpContext.Response.Redirect("/Home/Login");
}
} public MangerController()
{
ViewBag.NewsCount = ;
} public ActionResult index()
{
return View();
}
public ActionResult wei_Configs()
{
return View();
} }
}

那么,按照上述的思路,如果你有多个Controller需要验证,那么就必须在每个Controller中重写这个方法,显然这样做是比较笨的方法,那么我们动动我们聪明的小脑袋,很快会想出一个方法:那就是继承。

我们写一个父亲控制器,在这个父亲控制器中,我们重写这个方法,然后在需子控制器中继承父亲控制器即可,代码如下:

看到这儿,相信做过webForm的童鞋就会想起basePage.cs中的如下代码:

那么,这样定义一个父亲控制器就算完美了吗?如果有个控制器需要继续另外一个类怎么办?

由于其已经继承了父亲控制器,那么子控制器就不能再继承其他类,这样显然降低了程序的可扩展性,我们应当怎么办呢?

还好,MVC为我们提供了过滤器,ActionFilterAttribute里也有OnActionExecuting方法,跟Controller中的OnActionExecuting方法一样, 同是抽象实现了IActionFilter接口。

我们新建派生类如下:

namespace WeiXinApi.App_Start
{
public class AuthenticationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
{
string cookieName = FormsAuthentication.FormsCookieName;//读取登录授权Cookies的名称
HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies[cookieName];//接收这个Cookies
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);//我们知道MVC登录授权的Cookies是加密的,所以我们在此需要解密
}
catch (Exception ex)
{
return;
}
if (authTicket != null && filterContext.HttpContext.User.Identity.IsAuthenticated)//如果Cookies不为Null 也通过验证
{
string UserName = authTicket.Name;
CommonMethod.setCookieForMIn("UserName", UserName, );//用于全局,加载用户信息
base.OnActionExecuting(filterContext);
}
else
{
filterContext.HttpContext.Response.Redirect("/Home/Login");//否则跳转至登陆页
}
}
}
}

至于MVC登录授权的方法,大家可以参考我的博客:MVC 登录认证与授权及读取登录错误码

在此,我们深究下ActionFilterAttribute 类的说明:

在此:问大家一个问题,何为:Attribute ?

中文名称解释为特性、属性

MVC的数据注解与验证中会用到好多特性,譬如:

那么,我们应当怎么使用新建的 AuthenticationAttribute 类呢?

根据需求,大家可在类范围内使用这个特性,亦可在Action方法头上使用这个特性。

以上便是MVC自定义过滤器特性来验证授权登录信息的方法

祝大家有个好心情,谢谢

@陈卧龙的博客

MVC 自定义过滤器/特性来实现登录授权及验证的更多相关文章

  1. MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器

    实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器 MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过A ...

  2. 实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器

    MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过App_Start中的FilterConfig来实现的过滤器注册是全局的,也就是整个应用程序都会使用的,针对单独的Fi ...

  3. ASP.NET MVC自定义AuthorizeAttribute篇知识点讲解—登录限制

    1.前言 a.微软对ASP.NET的开发从WebForm到MVC的转变,已经正式过去5,6个年头,现在WebForm和MVC也都越来越完善,小小算来我也已经工作了将近三年,从大学的时候学习ASP.NE ...

  4. asp.net mvc 自定义全局过滤器 验证用户是否登录

    一般具有用户模块的系统都需要对用户是否登录进行验证,如果用户登录了就可以继续操作,否则退回用户的登录页面 对于这样的需求我们可以通过自定义一个独立的方法来完成验证的操作,但是这样代码的重复率就大大提高 ...

  5. asp.net MVC之 自定义过滤器(Filter) - shuaixf

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration :缓存的时间, 以 ...

  6. asp.net MVC之 自定义过滤器(Filter)

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  7. MVC系统过滤器、自定义过滤器

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  8. ASP.NET MVC 系统过滤器、自定义过滤器

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  9. MVC之 自定义过滤器(Filter)

    MVC之 自定义过滤器(Filter) 一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttri ...

随机推荐

  1. eclipse中的项目Java build path (Java创建路径)详解

    1.Source标签页,指定本工程的源码目录和输出目录.Projects标签页,指定本工程所依赖的其他工程.Libraries标签页,指定本工程所需的jar包和class目录等.Order And E ...

  2. PHP pear安装

    PHP pear安装 Posted on 2012-07-06 10:19 bug yang 阅读(5787) 评论(0) 编辑 收藏 转自:http://wangye.org/blog/archiv ...

  3. Delphi格式化输出函数(1): Format

    vars: string;begin//指令类型 types := Format('最大整数是: %d; 最小整数是: %d',[MaxInt,Low(Integer)]);//返回: 最大整数是: ...

  4. Spring IoC反转控制的快速入门

    * 下载Spring最新开发包 * 复制Spring开发jar包到工程 * 理解IoC反转控制和DI依赖注入 * 编写Spring核心配置文件 * 在程序中读取Spring配置文件,通过Spring框 ...

  5. php 分词 —— PHPAnalysis无组件分词系统

    分词,顾名思义就是把词语分开,从哪里分开?当然是一大堆词语里了,一大堆词语是什么?是废话或者名言.这在数据库搜索时非常有用. 官方网站 http://www.phpbone.com/phpanalys ...

  6. java JDK8 学习笔记——第16章 整合数据库

    第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...

  7. oracle截取某个字符前面的字符串

    已验证. 要求:A.数据库表中的一个字符串 可能含有"+" 例:ORC+001 也可能不含“+” B.要求如果该字符串含有“+”,则取“+”之前的字符 例:ORC+001 取ORC ...

  8. 用Dictionary代替if

    public Dictionary<string, System.Drawing.RotateFlipType> dicRFT = new Dictionary<string, Sy ...

  9. maven3创建多模块web项目

    实现步骤 创建项目目录 进入“工作空间”目录,创建名为treasure的文件夹,切换至控制台,进入该文件夹. 配置模块 生成各个模块  maven-archetype-quickstart 默认的Ar ...

  10. 【转】Android各种Adapter的用法

    转自:http://my.oschina.net/u/658933/blog/372151 Android各种Adapter的用法 发表于5个月前(2015-01-27 10:56)   阅读(143 ...