分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

MVC基本类型的过滤器

发布时间:2023-09-06 02:28责任编辑:傅花花关键词:MVC

过滤器在mvc中发挥着很重要的作用

过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响应内容,只响应特定内容给那些有特定权限的用户,过滤器理论上有以下功能:

判断登录与否或用户权限
决策输出缓存
防盗链
防蜘蛛
本地化与国际化设置
实现动态Action(做权限管理系统的好东西)

过滤器类型接口默认实现继承类功能描述
ActionIActionFilterActionFilterAttribute在动作方法之前及之后运行
ResultIResultFilterActionFilterAttribute在动作结果被执行之前和之后运行
AuthorizationFilterIAuthorizationFilterAuthorizeAttribute首先运行,在任何其它过滤器动作方法之前运行
ExceptionIExceptionFilterHandleErrorAttribute只在另外一个过滤器,动作方法,动作结果弹出异常时运行

一、Action过滤器

       Action过滤器和Result过滤器我在这里是一起添加

首先说一下Action过滤器;主要负责在动作方法之前及之后运行(动作,方法权限)

       1、ActionAttribute过滤器继承ActionFilterAttribute类

       2、ActionAttribute过滤器调用IActionFilter接口

       3、重写OnActionExecuting方法;此方法是在Action动作方法执行前

       4、重写OnActionExecuted方法;此方法是在Action动作方法执行后

Result过滤器;在动作结果被执行之前和之后运行 (结果权限)

       1、ActionAttribute过滤器继承ActionFilterAttribute类(和Action继承成的同一个基类)

       2、ActionAttribute过滤器调用IResultFilter接口

       2、重写OnResultExecuting方法;此方法是在执行操作结果前

       3、重写OnActionExecuted方法;此方法是在执行操作结果前

代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MVCcation.Filters{ ???//Action在动作方法之前及之后运行 ???public class ActionAttribute: ActionFilterAttribute, IActionFilter ???{ ???????public override void OnResultExecuting(ResultExecutingContext filterContext) ???????{ ???????????//base.OnResultExecuting(filterContext); ???????????filterContext.HttpContext.Response.Write("在执行操作结果前"); ???????} ???????public override void OnResultExecuted(ResultExecutedContext filterContext) ???????{ ???????????//base.OnResultExecuted(filterContext); ???????????filterContext.HttpContext.Response.Write("在执行操作结果后"); ???????} ???????public override void OnActionExecuting(ActionExecutingContext filterContext) ???????{ ???????????//base.OnActionExecuting(filterContext); ???????????filterContext.HttpContext.Response.Write("在Action方法执行前"); ???????} ???????public override void OnActionExecuted(ActionExecutedContext filterContext) ???????{ ???????????//base.OnActionExecuted(filterContext); ???????????filterContext.HttpContext.Response.Write("在Action方法执行后<br/>"); ???????} ???}}

接下来就在控制器中过滤器;这里我选择index视图,所以在index控制器上面添加过滤器

using MVCcation.Filters;//引用过滤器文件目录using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MVCcation.Controllers{ ???public class HomeController : Controller ???{ ???????[Action]//(执行动作和操作)动作处理器 ???????public ActionResult Index() ???????{ ???????????return View(); ???????} ???????public ActionResult About() ???????{ ???????????ViewBag.Message = "Your application description page."; ???????????return View(); ???????} ???????public ActionResult Contact() ???????{ ???????????ViewBag.Message = "Your contact page."; ???????????return View(); ???????} ???}}

可以看出Action会在方法执行前后输出,也在Result前面输出

二、AuthorizationFilte过滤器

   首先运行,在任何其它过滤器动作方法之前运行(授权限)

       1、AuthorizationFilte过滤器继承AuthorizeAttribute类

       2、AuthorizationFilte过滤器调用IAuthorizationFilter接口

       3、用Request["userType"]是否是vip;如果是测可以访问,否则就跳转到百度

       4、在Index控制器中添加 [AuthorizationFilterAttribute("vip")]//(授权过滤器)只有Vip角色才能进行访问Index视图

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MVCcation.Filters{ ???//过滤器一般以Attribute结尾 ???//[添加注解][过滤器类型] ???//授权过滤器AuthorizationFilter 继承默认接口AuthorizAttribute ???public class AuthorizationFilterAttribute: AuthorizeAttribute,IAuthorizationFilter ???{ ???????public AuthorizationFilterAttribute(string usertype) ???????{ ???????????Roles = usertype; ???????} ???????protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) ???????{ ???????????string userType = HttpContext.Current.Request["userType"]; ???????????if (userType!="vip") ???????????{ ???????????????filterContext.Result = new RedirectResult("http://www.baidu.com"); ???????????} ???????????else ???????????????Roles.Contains(userType); ???????????//base.HandleUnauthorizedRequest(filterContext); ???????} ???}}

三、Exception过滤器(异常处理)

   只在另外一个过滤器,动作方法,动作结果弹出异常时运行(异常处理权限)

       1、Exception过滤器继承HandleErrorAttribute类

       2、Exception过滤器调用IExceptionFilter接口

       3、当用户或者访问者访问自身没有权限访问页面,程序会抛出一个错误然后,Exception过滤器处理这个错误后会抛出一个没有权限的提示,这里处理错误我是设置跳转到一个网址

       4、还是在Index视图控制器上添加ExceptionAttribute过滤器

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc; namespace MVCcation.Filters{ ???public class ExceptionAttribute:HandleErrorAttribute ???{ ???????public override void OnException(ExceptionContext filterContext)//发生异常时调用http://www.hermanboke.cn ???????{ ???????????if (!filterContext.ExceptionHandled) ???????????{ ???????????????filterContext.Result = new RedirectResult("http://www.hermanboke.cn");//出现错误后跳转到这个网址 ???????????????filterContext.ExceptionHandled = true; ???????????} ???????????base.OnException(filterContext); ???????} ???}}

这里我们要在Index控制器里面故意抛出一个错误,来让Exception过滤器处理

 throw new DllNotFoundException();//抛出一个异常

 ???????[AuthorizationFilterAttribute("vip")]//(授权过滤器)只有Vip角色才能进行访问Index视图 ???????[Action]//(执行动作和操作)动作处理器 ???????[Exception]//(错误日志处理器) ???????public ActionResult Index() ???????{ ???????????throw new DllNotFoundException();//抛出一个异常 ???????????return View(); ???????}

然后运行index视图;在浏览器中输入http://localhost:50003/Home/Index?userType=vip就会跳转到指定错误的页面

MVC基本类型的过滤器

原文地址:https://www.cnblogs.com/live8/p/10203229.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved