一、知识了解

  1. Asp.Net MVC提供了以下几种默认的Filter:
  2. 大家注意一点,Asp.Net MVC提供的ActionFilterAttribute默认实现了IActionFilter和IResultFilter。而ActionFilterAttribute是一个Abstract的类型,所以不能直接使用,因为它不能实例化,所以我们想使用它必须继承一下它然后才能使用。

    Filter继承于ActionFilterAttribute抽象类,并可以覆写
    void OnActionExecuting(ActionExecutingContext)                                                                                                                                    
    voidOnActionExecuted(ActionExecutedContext)                                                                                                                                                
    void OnResultExecuting(ResultExecutingContext)                                                                                                                                                          
    void OnResultExecuted(ResultExecutedContext)。

  3. 它们的执行先后顺序如下:

  OnActionExecuting是Action执行前的操作

  OnActionExecuted则是Action执行后的操作

  OnResultExecuting是解析ActionResult前执行

  OnResultExecuted是解析ActionResult后执行

接下来我们只要对以上的方法进行重写就可以在相应的步骤做一些操作了。
二、实操
       1.首先添加一个普通的类TestFilterAttribute,这个类要继承ActionFilterAttribute,代码如下

/// <summary>
2 /// Filter 执行顺序Test,需要继承筛选器的基类ActionFilterAttribute
3 /// </summary>
4 public class TestFilterAttribute : ActionFilterAttribute
5 {
6 public string Message { get; set; }
7
8 public override void OnActionExecuting(ActionExecutingContext filterContext)
9 {
10 base.OnActionExecuting(filterContext);
11 filterContext.HttpContext.Response.Write("Action执行之前" + Message + "<br />");
12 }
13
14 public override void OnActionExecuted(ActionExecutedContext filterContext)
15 {
16 base.OnActionExecuted(filterContext);
17 filterContext.HttpContext.Response.Write("Action执行之后" + Message + "<br />");
18 }
19
20 public override void OnResultExecuting(ResultExecutingContext filterContext)
21 {
22 base.OnResultExecuting(filterContext);
23 filterContext.HttpContext.Response.Write("返回Result之前" + Message + "<br />");
24 }
25
26 public override void OnResultExecuted(ResultExecutedContext filterContext)
27 {
28 base.OnResultExecuted(filterContext);
29 filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />");
30 }
31 }

写完这个代码后,我们回到Action上,打上上面的标记如下所示:

 [TestFilterAttribute(Message = "Action")]
2 public ActionResult Index()
3 {
4 HttpContext.Response.Write("Action正在执行···<br />");
5 return Content("正在返回Result···<br />");
6 }

执行结果:

*如果我们将此标签打到Controller上的话,TestFilterAttributeFilter将作用到Controller下的所有的Action

*默认情况下Action上打了TestFilterAttribute 标签后,虽然在Controller上也打上了此标签,但它只有Action上的标签起作用了。

*补充:如果Action没有打上TestFilterAttribute标签,那么Controller上的标签便会被执行。

 

Index 执行时,Filter的方法只执行了一次,而某些情况下我们也想让Controller上的FilterAttribute也执行一次TestFilterAttribute,那我们怎么才能让Controller上的[TestFilter(Message = "controller")]也起作用呢?

答案是:我们只需在TestFilterAttribute类的定义上打上标记[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]即可,也就是让其成为可以多次执行的Action。代码如下:

/// <summary>
/// Filter 执行顺序Test,需要继承筛选器的基类ActionFilterAttribute
/// </summary
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)] //打标记是让所有的Controller的标记生效
public class TestFilterAttribute : ActionFilterAttribute
{
public string Message { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
filterContext.HttpContext.Response.Write("Action执行之前" + Message + "<br />");
} public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
filterContext.HttpContext.Response.Write("Action执行之后" + Message + "<br />");
} public override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
filterContext.HttpContext.Response.Write("返回Result之前" + Message + "<br />");
} public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />");
}
}

效果:

问:如何注册到全局?

答案就在Global.asax中。让我们看以下代码,我是如何将上面我们定义的TestFilterAttribute 注册到全局Filter中

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
//注册全局过滤器
filters.Add(new TestFilterAttribute() { Message="全局"});
}

三、其他Fileter
1.AcceptVerbs      规定页面的访问形式,如

        [AcceptVerbs(HttpVerbs.Post)]
public ActionResult Example(){
return View();
}

2.ActionName     如果不想用方法名做为Action名,或Action名为关键字的话,如

       [ActionName("class")]
public ActionResult Example(){
return View();
}

3.NonAction     当前方法仅是普通方法不解析为Action

4.为Action添加缓存

        [OutputCache(Duration = 60, VaryByParam = "*")]
public ActionResult Example()
{
return View();
}

5.Action可以接受Html等危险代码(ASP.NET MVC在aspx中设置<%@ Page 的属性无法完成等同任务。)

        [ValidateInput(false)]
public ActionResult Example()
{
return View();
}

文章转载:https://www.cnblogs.com/zhangxiaoyong/p/6906288.html#autoid-0-0-0

.net mvc 权限验证 Filter(过滤器)的更多相关文章

  1. NET MVC权限验证

    ASP.NET MVC权限验证 封装类 写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一 ...

  2. 关于filter web api mvc 权限验证 这里说的够详细了。。。

    参考:http://www.cnblogs.com/willick/p/3331520.html Filter(筛选器)是基于AOP(面向方面编程)的设计,它的作用是对MVC框架处理客户端请求注入额外 ...

  3. MVC权限验证过滤器

    Action属性,权限设定属性   [AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)] ...

  4. C# MVC权限验证

    前言 之前一直没怎么接触过权限验证这块,刚好公司老平台改版,就有了这篇权限验证.此篇文章大致讲解下 精确到按钮级别的验证如何实现.以及权限验证设计的参考思路(菜鸟一枚,大神勿喷). 在开发大项目的时候 ...

  5. ASP.NET MVC权限验证 封装类

    写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一个全局过滤器 //受权过滤器 publi ...

  6. .net web mvc 权限验证

    这里分享MVC的权限验证,内容中可能存在一些,莫名其妙的方法,那些是以前封装好的,大致可以根据方法名称知道他的意思. using Game.Entity; using Game.Entity.Plat ...

  7. mvc 权限验证

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  8. mvc权限验证--AuthorizeAttribute

    在做后台管理时用户登录后就需要验证哪些权限了,没有登录的就直接退出到登录页面. 系统有自带的权限[Authorize],可用于几个地方: 1.将属性[Authorize]置于相关的action上方,验 ...

  9. MVC权限验证之ActionFilterAttribute

    参考:http://www.cnblogs.com/waitingfor/archive/2011/12/27/2303784.html ActionFilterAttribute是Action过滤类 ...

  10. Asp.net MVC 权限验证,以及是否允许匿名访问

    public class CheckUserAttribute : ActionFilterAttribute, IAuthorizationFilter { public void OnAuthor ...

随机推荐

  1. 【SQL基础】【关键字大写】条件查询:比较、不等于、IN、为空、BETWEEN

    〇.概述 1.内容介绍 条件查询:比较.不等于.IN.为空.BETWEEN 2.建表语句 drop table if exists user_profile; CREATE TABLE `user_p ...

  2. 【重难点总结】DMA与kafka零拷贝机制之间的关系

    一.DMA介绍 1.概念 DMA(Direct Memory Access,直接存储器访问) 是一种内存访问技术,独立于CPU, 直接读.写系统存储器.外设等 主存与I/0设备之间使用DMA控制器控制 ...

  3. Java第一课Hello World

    java第一课 Hello World 学习 新建文件夹放写的代码 新建.txt文件,并写入java 输出Hello World 的代码  public class Hello{     public ...

  4. MQ系列10:如何保证消息幂等性消费

    MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 MQ系列5:RocketMQ消息的发送模式 MQ系 ...

  5. Codeforces Round #842 (Div. 2) A-D

    比赛链接 A 题意 给一个数 \(k\) 找到最大的 \(x\) ,满足 \(1 \leq x < k\) 且 \(x!+(x-1)!\) 是 \(k\) 的倍数. 题解 知识点:数学. 猜测 ...

  6. python之路22 hashlib、subprocess、logging模块

    hashlib加密模块 hashlib模块为不同的安全哈希/安全散列(Secure Hash Algorithm)和 信息摘要算法(Message Digest Algorithm)实现了一个公共的. ...

  7. YMOI2019-5.4

    题解 YMOI2019-5.4 前言 欸,被干爆了.. 太菜了.亏我还提前看题了,还是自古大神出民间 YMOI2019的第二次考试吧.第一次没参加,这一次是第一次却出师不利..还要继续加强 还是总结一 ...

  8. Springboot+Dplayer+RabbitMQ实现视频弹幕延时入库

    编写之初,在网上找了很多关于springboot整合dplayer实现弹幕的方式,发现案例很少,然后自己就着手写一个小项目,分享给大家~ 注:Dplayer版本:v1.22.2 流程:前端自定义弹幕发 ...

  9. npm 环境搭建---全局安装angular cli ---升级本地angular版本---搭建ng-alain

    1.环境搭建 node -v # 查看 Node.js 当前版本 npm -v # 查看 Npm 当前版本 2.设定淘宝提供 Npm 源镜像 # 设置淘宝源 npm config set regist ...

  10. ATM+购物车功能

    ATM+购物车功能 一.项目需求 1.额度15000或自定义 --> 注册功能 2.实现购物商城,买东西加入购物车,调用信用卡接口结账 --> 购物功能.支付功能 3.可以提现,手续费5% ...