ASP.NET MVC过滤器(一)

时间:2021-09-13 10:08:37

  MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证、系统日志、异常处理、缓存等。MVC 中包含Authorization filter、Action filter、Result filter、Exception filter 四种过滤器。

  APS.NET MVC中的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理。这时候就用到了过滤器。

一、MVC支持的过滤器类型有四种:

  Authorization(授权)

  Action(行为)

  Result(结果)

  Exception(异常)

滤器类型

接口

描述

Authorization

IAuthorizationFilter

此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法

Exception

IExceptionFilter

用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常

Action

IActionFilter

用于进入行为之前或之后的处理

Result

IResultFilter

用于返回结果的之前或之后的处理

 

  但是默认实现它们的过滤器只有三种,分别是Authorize(授权),ActionFilter,HandleError(错误处理);各种信息如下表所示

二、使用Filter的方式

  1、通过特性的方式使用Filter

  2、通过重写Controller方法来使用Filter

三、Authorize过滤器

方法一:使用特性的方式

  定义一个类,继承与AuthorizeAttribute,并重写OnAuthorization方法

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcApplication2.Filters
{
public class LoginAttribute:AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//如果Session中不存在该值,那么表示没有登录
if (filterContext.HttpContext.Session["User"] == null)
{
filterContext.Result = new RedirectResult("/Account/Login");
}
}
}
}

  这里判断如果,用户没有登录,那么需要返回到登录界面。

  虽然定义了一个过滤器,但是还需使用过滤器

使用过滤器的方式也有几种方式:

1、在方法前加上授权特性

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication2.Filters; namespace MvcApplication2.Controllers
{
public class HomeController : Controller
{
//在方法上加入授权特性
[Login]
public ActionResult Index()
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; return View();
} public ActionResult About()
{
ViewBag.Message = "Your app description page."; return View();
} public ActionResult Contact()
{
ViewBag.Message = "Your contact page."; return View();
}
}
}

  这种方式,只能对有加上该授权特性的方法进行登录检查,其它没有加的方法无法进行过滤。在上面代码中,只能对该controller中index的action进行过滤,另外的About和Contact无法过滤。

2、在类上加特性,那么表示对该类下所有方法加上该特性

 using System.Web;
using System.Web.Mvc;
using MvcApplication2.Filters; namespace MvcApplication2.Controllers
{
[Login]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; return View();
} public ActionResult About()
{
ViewBag.Message = "Your app description page."; return View();
} public ActionResult Contact()
{
ViewBag.Message = "Your contact page."; return View();
}
}
}

  这种方式虽然不用对每个方法都添加特性,但是也只是对在类上加上了该特性的Controller有作用,其它没有加的会无效

3、注册全局过滤器

  在实际项目中,一个项目往往会有很多的Controller和Action那么,如果向上面的两种方式来出来都不够理性,通常我们使用全局过滤器。使用方式

 using System.Web;
using System.Web.Mvc; namespace MvcApplication2
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//在此处添加需要注册的全局过滤器
filters.Add(new MvcApplication2.Filters.LoginAttribute());
}
}
}

  这样就不用再每个类上添加Login过滤器了,默认对每个Controller的每个Action都使用该特性。但是有个问题,就是连登陆页面也被过滤掉了。在这里使用AllowAnonymous都无效

   可以在自定义Filter时,通过获取当前访问路径,判断是否是需要排除的路径,如果是,则跳过

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcApplication2.Filters
{
public class LoginAttribute:AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//获取当前相对项目的更目录的路径
string path = filterContext.HttpContext.Request.CurrentExecutionFilePath;
if(!path.StartsWith("/Account/", StringComparison.CurrentCultureIgnoreCase))
{
//如果Session中不存在该值,那么表示没有登录
if (filterContext.HttpContext.Session["User"] == null)
{
filterContext.Result = new RedirectResult("/Account/Login");
}
} }
}
}

  这里,以/Account/开始的请求都不会执行该授权过滤器。

方法二:使用重写Controller方法的方式

 protected override void OnAuthorization(AuthorizationContext filterContext)
{
//自定义授权验证代码
}

  这种方式相当于在类上使用授权特性,对于该Controller下的所有方法都有效

四、异常过滤器

  需要继承与HandleErrorAttribute,并重写OnException方法

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace MvcApplication2.Filters
{
public class MyExceptionAttribute:HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext); //填写验证信息,记录错误日志 //跳转到错误页面
filterContext.Result = new RedirectResult("/Error");
}
}
}

  这里base.OnException(filterContext)不能省略,否则无法捕获到异常

  同时在web.config文件中需要配置,启用自定义异常。    <customErrors mode="On"></customErrors>

五、行为和结果过滤器

  这两种过滤器都是继承于ActionFilterAttribute类

  行为过滤器:需要选择重写OnActionExecuting或者OnActionExecuted,至于是哪个方法看需求,也可以哪个方法都重写

  结果过滤器:需要选择重写OnResultExecuting或者OnResultExecuted,至于是哪个方法看需求,也可以哪个方法都重写

  

ASP.NET MVC过滤器(一)的更多相关文章

  1. ASP&period;NET MVC 过滤器&lpar;一&rpar;

    ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...

  2. ASP&period;NET MVC 过滤器&lpar;三&rpar;

    ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中, ...

  3. ASP&period;NET MVC 过滤器&lpar;四&rpar;

    ASP.NET MVC 过滤器(四) 前言 前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍. ASP ...

  4. ASP&period;NET MVC 过滤器&lpar;五&rpar;

    ASP.NET MVC 过滤器(五) 前言 上篇对了行为过滤器的使用做了讲解,如果在控制器行为的执行中遇到了异常怎么办呢?没关系,还好框架给我们提供了异常过滤器,在本篇中将会对异常过滤器的使用做一个大 ...

  5. ASP&period;NET没有魔法——ASP&period;NET MVC 过滤器&lpar;Filter&rpar;

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  6. Asp&period;net Mvc 过滤器执行顺序

    Asp.net Mvc 过滤器执行顺序: IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting)- ...

  7. ASP&period;NET MVC过滤器

    在ASP.NET MVC中有个重要特性就是过滤器,使得我们在MVC程序开发中更好的控制浏览器请求的URL,不是每个请求都有响应内容,只有特定得用户才有.园子里关于过滤器的资料也有很多,这篇文章主要是记 ...

  8. ASP&period;NET MVC 过滤器开发与使用

    ASP.NET MVC 中给我们提供了内置的过滤器,通过过滤器,我们可以在控制器内的方法前后,添加必须的业务逻辑,如权限验证,身份验证,错误处理等. 今天,我们主要介绍3个过滤器:OutputCach ...

  9. Asp&period;Net MVC过滤器小试牛刀

    在上学期间学习的Asp.Net MVC,基本只是大概马马虎虎的了解,基本处于知其然而不知其所以然.现在到上班,接触到真实的项目,才发现还不够用,于是从最简单的过滤器开始学习.不得不说MVC的过滤器真是 ...

随机推荐

  1. JAVA中SERIALVERSIONUID的解释

    serialVersionUID作用:        序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.有两种生成方式:       一个是默认的1L,比如:private st ...

  2. Linux的nm查看动态和静态库中的符号

    功能 列出.o .a .so中的符号信息,包括诸如符号的值,符号类型及符号名称等.所谓符号,通常指定义出的函数,全局变量等等. 使用 nm [option(s)] [file(s)] 有用的optio ...

  3. myeclipse打war包

    转自:http://wjlvivid.iteye.com/blog/1401707 右键选中项目,选择export然后选择J2EE->WAR File,点击next 接下来指定war包的存放路径 ...

  4. 用ADB&lpar;Android Debug Bridge&rpar;实时监测Android程序的运行

      监控Android设备上程序的运行,需要ADB的配合,具体ADB工具的介绍以及命令选项可见博客: http://blog.csdn.net/mliubing2532/article/details ...

  5. 关于用VMware克隆linux系统后,无法联网找不到eth0网卡的问题

    当使用克隆后的虚拟机时发现系统中的网卡eth0没有了,使用ifconfig -a会发现只有eth1.因为系统是克隆过来的,原有的eth0以及ip地址都是原先网卡的,VMware发现已经被占用,就会创建 ...

  6. bzoj4361isn dp&plus;容斥

    4361: isn Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 370  Solved: 182[Submit][Status][Discuss] ...

  7. util&period;go 源码阅读

        }     h := md5.New()     baseString, _ := json.Marshal(obj)     h.Write([]byte(baseString))      ...

  8. hdu2586How far away ?&lpar;LCA LCATarjan离线&rpar;

    题目链接:acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:有n个点,同n-1条带有权值的双向边相连,有m个询问,每个询问包含两个数x,y,求x与y的最短距离. ...

  9. JS控制台打印佛祖加持护身符

    console.log([     "                   _ooOoo_",     "                  o8888888o&quot ...

  10. 用C&num;实现多种方式播放Wav声音

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...