.net mvc 权限验证 Filter(过滤器)

一、知识了解

  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

推荐这些技术文章:

MVC 角色验证权限 自定义 求解

问题
自己写一个访问的权限  如果用户已经登陆 但是权限不够就 跳转到一个页面提示没有权限访问   但是 我写好之后只能跳转到登陆页面  再有就是按照如下的代码 能跳转大页面 但是 即使是有权限的用户也跳转到这个页面 也就是说 无论什么情况都跳到这个页面  有权限的用户也不能继续的访问
求解决  在线等using...

Filter执行过程是什么?

3)Filter执行的顺序 马 克-to-win:根据上面的说明“Filter的拦截的工作过程”的图,我们对Filter的Helloworld例子做一个小小的扩展(增加了一个 MarkToWinFilter2,代码和MarkToWinFilter几乎一样),来说明Filter的顺序,结论:filter-mapping在Web.xml中的顺序决定了Filter执行的顺序。例 1.2.3Web.xm...

SpringBoot —— Filter 过滤器\拦截器

SpringBoot——实现过滤器Filter
1、Filter过滤器
(1) 主要用来过滤用户请求的,允许我们对用户的请求进行前置处理和后置处理。面向切面编程AOP。
例如:实现URL级别的权限控制、过滤非法请求等。
(2)Filter是依赖于Servlet容器(Filter接口在Servlet包下),增强版的servlet
(3)自定义Filter
方法一 : 1、实现javax....

filter过滤器

filter过滤器用来过滤网站的数据,可以处理中文乱码,登陆验证

 
 实现接口

 
 在web.xml中注册filter过滤器

 
 
初始化可以加载日志
中间写业务代码

 
 
销毁

 

...

.Net Core Api 操作过滤器(行为过滤器) +.net core Api过滤器获取QueryString值 或 获取请求标头数据

.Net Core API操作过滤器(行为过滤器)
  --分别在操作方法之前和之后执行
  继承Attribute类,实现IActionFilter接口,重写OnActionExecuting 和 OnActionExecuted方法。
    或者直接继承ActionFilterAttribute类,观察源码可知,该类继承了Attribute类,而且还实现IAc...

.net 中如何创建一个新的会话。

问题
用软件扫出登录出现会话标识未更新的问题如何解决。

Response.Write(System.Web.HttpContext.Current.Session.SessionID);Response.Write("<br />"); Response.Cookies.Add(new System.Web.HttpCookie(...

asp.net mvc Action 的重载

问题
不加Filter的情况下Action 不能重载吗?为什么总是出现此异常呢:AmbiguousMatchException

最佳回答
暂不能做到,为什么不能加Filter呢

...

Filter过滤器不同注册方式

1、Action上面注册只对当前的Action有效
2、放在控制器类上面,对当前控制所有方法有效
3、全局注册,对项目所有控制器Action有效
在Programs.cs里面修改如果代码

builder.Services.AddControllersWithViews(mvcOptions =>{   mvcOptions.Filters.Add<CustomResource...

关于mvc页面静态输出,不执行action的问题

问题
现在是在第一次执行的时候action 和viewPage的内容保存成了一个文件,下一次执行的时候直接去读那个文件的内容,而不是再一次去执行action里面的代码,但是我在OnActionExecuting不管怎么操作,都会去执行里面的代码,如果在不改变url地址的情况下让程序去读这个静态页面?

最佳回答
filterContext.R...

asp.net mvc 如何作到安全?

问题
用 mvc 来开发的时候 能网体现出分层。但现在些问题
mvc 的操作都经过 Action来完成的。我现在对数据进行删除 操作
public ActionResul(int id)
{
............
}
地址是: http://xxxxx/Delete/1
这样就能删除 id为我的记录了。
但想想如果只知道 地址 就可以对记录进行删除,那不...

文章标题:.net mvc 权限验证 Filter(过滤器)
文章链接:https://www.dianjilingqu.com/4447.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>