一、知识了解

  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. Zabbix与乐维监控对比分析(二)——Agent管理、自动发现、权限管理

    上期我们详细介绍了Zabbix与乐维监控的架构与性能对比分析,透过架构与性能对比分析,用户可以对乐维监控之所以能成为"Zabbix企业版"有一个初步的认知.本篇是Zabbix对比乐 ...

  2. 【每日一题】【树的dfs递归,返回多次,注意都遍历完后才最终返回】2022年1月6日-112. 路径总和

    给你二叉树的根节点 root 和一个表示目标和的整数 targetSum .判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum .如果存在,返回 tr ...

  3. 关于Mybatis-Plus中update()、updateById()方法的使用及null值的判断

    使用场景说明: 在 Mybatis-Plus 的使用过程中,经常会遇对数据库更新的情况 更新常用方法:update().updateById() 问题:经常会遇见对 null 值的处理,对传入的实体参 ...

  4. 你的项目使用Optional了吗?

    1.基本概念 java.util.Optional<T>类本质上就是一个容器,该容器的数值可以是空代表一个值不存在,也可以是非空代表一个值存在. 2.获取对象 2.1 相关方法 2.2 案 ...

  5. 秒级查询之开源分布式SQL查询引擎Presto实操-上

    @ 目录 概述 定义 概念 架构 优缺点 连接器 部署 集群安装 常用配置说明 资源管理安装模式 安装命令行界面 基于Tableau Web 连接器 使用优化 数据存储 查询SQL优化 无缝替换Hiv ...

  6. 教你几个 Java 编程中的奇技淫巧

    枯燥的编程中总得有些乐趣,今天我们不谈论那些高深的技能,教你几个在编程中的奇技淫巧,说不定在某些时候还能炫耀一番呢. 1.找到最大值和最小值 不使用 if else switch 和三元运算符,在给定 ...

  7. 成功解决pycharm 的setting中的Error occurred when installing package 'Keras'

    成功解决pycharm 的setting中的Error occurred when installing package 'Keras' 刚刚开始学习python在安装package上碰了不上壁. M ...

  8. 开源库libcli的安装与使用

    源码:https://github.com/dparrish/libcli 环境 Ubuntu 20.04.2 LTS 编译libcli 参考:README.md 按照libcli中的 README ...

  9. CFS三层内网靶场

    前言 最近学习了内网的一些知识,想着打一下靶场来试试,选择了这个CFS的三层内网靶场,做一下记录 靶场下载地址   链接:https://pan.baidu.com/s/1zGw5VNt222nCmf ...

  10. [C#]C++/CLI中^的含义

    例子 // here normal pointer P* ptr = new P; // usual pointer allocated on heap P& nat = *ptr; // o ...