MVC初体验-过滤器(10)

主要有4中过滤器:

1.Authorization  身份验证过滤器

理解身份验证过滤器和无侵入式开发;

假如我这里有学生和教室两个对象,学生进入教室需要进行身份验证,如果在A学生上增加验证,那么在代码层面就构成了侵入式开发,需要修改学生A的代码,如果多了一个学生C,那么又需要继续增加验证代码,不合适;

如果在教室对象上增加身份验证代码,如果新增了教室D,那么身份验证又需要重写,同时也构成了侵入式开发;

所以最好的方案是不修改学生和教室,在它们中间加入一层中间验证,哪个教室需要身份验证,就给它加入一个验证标签即可;

通过特性的方式打标记,决定哪些类或者行为需要进行验证;

特性怎么使用的:

身份验证过滤器怎么写:

如何自定义写过滤器(代码):

1)方法一:

①首先新建一个Filter文件夹(非必须,便于管理),新建一个MyAuthorization类,然后继承AuthorizationAttribute,然后重写OnAuthorization方法;

    public class MyAuthorization:AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            //如果保留如下代码,则会运行.net framework定义好的身份验证,如果需要使用自定义身份验证,则禁用下列代码
            //base.OnAuthorization(filterContext);

            //获取Http上下文内容
            filterContext.HttpContext.Response.Write("123456");

            //如果需要实现页面跳转功能,需要使用Result,而不是使用Respon.Redirect(),
            //因为第二种方案服务端的代码仍然会继续往下执行,不会停止
            //filterContext.Result = new RedirectResult("controller/action");
        }
    }

②应用特性到行为或者控制器;

    [MyAuthorization]
    public class HomeController : Controller
    {
        [MyAuthorization]
        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();
        }
    }

可以放置过滤特性标签到控制器类上或者行为上。

如何全局注册过滤器,使得所有的控制器,行为都具有过滤特性;

在Global文件中的

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

RegisterGlobalFilters中增加下面代码即可

//所有都有了身份验证
filters.Add(new MyAuthorization());

2)方法二:

重写控制器的内部OnAuthorization方法,这样会应用过滤于控制器下的所有行为;

public class HelloController : Controller
    {
        // GET: Hello
        [MyAuthorization]
        public ActionResult Index()
        {
            return View();
        }
        //重写此方法即可,在执行顺序上优先调用该验证
        protected override void OnAuthorization(AuthorizationContext filterContext)
        {
            filterContext.HttpContext.Response.Write("Inner Hello!");
        }
    }

缺点:灵活性不够,推荐使用特性的方式,但是这种也可以。

2.异常处理过滤器

怎么做:

首先还是定义一个过滤器的类,该类继承开篇提到的HandleErrorAttribute类,然后类中重写OnException方法;

    public class MyException:HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            //如下代码不可删除,否则将无法捕获到异常
            base.OnException(filterContext);

            //记录日志

            //页面跳转
            filterContext.Result = new RedirectResult(@"/Error/400.html");
        }
    }

因为异常过滤器一般会设置在全局环境中,那么在注册过滤器的代码中需要这么样写:

public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //系统默认的异常处理过滤器,如果使用自定义异常处理,要禁用如下代码
            //filters.Add(new HandleErrorAttribute());
            //异常捕获
            filters.Add(new MyException());

            //所有都有了身份验证
            filters.Add(new MyAuthorization());

        }
    }

光有了这些还不够,直接执行异常的话会报错,是因为在webconfig中的system.web下增加customErrors标签,并且设置mode属性为On即可;

<system.web>
    <customErrors mode="On"></customErrors>
    <compilation debug="true" targetFramework="4.5"/>
    <httpRuntime targetFramework="4.5"/>
  </system.web>

然后在项目中新建一个Error文件夹,再新建一个400.html文件即可。

同理身份验证,也可以在控制器类中重写OnException方法,然后将该控制器作为自定义基类控制器,让子类的行为都具有异常处理。

3.行为过滤器

还是在Filter文件夹下增加一个MyActionFilter类,然后继承ActionFilterAtterbute,根据需要去重写行为执行前或者行为执行后的 过滤方法即可;

public class MyActionFilter:ActionFilterAttribute
    {
        //想在行为执行前就重写行为执行前的方法,反之亦然,不必要两个方法都重写

        //行为执行前
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("行为执行前:");
        }
        //行为执行后
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("行为执行后!!!!");
        }
    }

然后按照使用特性的方式去使用行为过滤器;

同理,也可以重写控制器类中OnActionExect[ing/ed] 方法,或者在全局中使用。

4.结果过滤器

同行为过滤器使用方法

总结:

End

原文地址:https://www.cnblogs.com/LeeSki/p/12254869.html

时间: 2024-10-30 06:31:09

MVC初体验-过滤器(10)的相关文章

ASP.NET MVC学习---(五)MVC初体验

经过之前n多的铺垫 我们已经大概了解了这个姓m名vc的家伙了 那么今天我们就来体验一把 怎么体验呢? 就来做一个小例子吧~ mvc增删改查的例子 数据库还是之前我们的老朋友 关系图: 表中的数据已填好 T_Users 将就着用着吧,哈哈 现在要求对T_Users表进行增删改查 开搞~ 回到之前新建的mvc项目 在Controllers文件夹下新建一个名为Home的空控制器 当浏览器请求Home下面的Index方法的时候返回什么? 当然是主页面啦 这里我们的主页面就是显示T_Users数据列表 代

MVC初体验-EF系列(CRUD)(20)

数据库数据:Northwind中的Region表 Region类是根据Region表自动生成的 后台代码: using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; using System.Web.Mvc; using T1_EF.Models; namespace T1_EF.Controllers { public class RegionController : Controller

MVC初体验-Razor和HtmlHelper(4)

1 动态改变路由规则,HtmlHelper的 如果使用了路由器中的默认路由,那么在浏览器的URL不会显式显示Controller的名字和Action的名字 输出 布表单 总结:本人感觉除了路由引用的可以使用HtmlHelper方法 其余的像布表单.一些其他的不建议使用这种混编代码. 确实增加了维护难度,并且前后端耦合了. 视图的数据从哪来?从行为来 怎么从行为向视图传数据,通过ViewData中的键值对 ViewBag是ViewData的简写,使用起来完全一样,实际就是一种动态字典类型 使用时在

MVC初体验-EF查询(Lambda的用法)(18)

使用数据库:NorthWind示例数据库 (链接:https://www.cnblogs.com/liverpool/p/4718042.html) 后台代码: namespace T1_EF.Controllers { public class CustomersController : Controller { // GET: Customers public ActionResult Index() { //NorthwindEntities northwind = new Northwi

MVC初体验-EF系列(总结)(23)

注意,增加,修改,删除的状态最终还是使用的状态版的,本质都是把数据附加到上下文,然后进行修改: 导航属性根据1对多或者多对1的关系,在生成类中的属性会分别生成一个集合属性或者一个标量属性: 是否禁用延时加载取决于数据量是否很大,数据变化是否十分频繁 End 原文地址:https://www.cnblogs.com/LeeSki/p/12267235.html

spring mvc 之初体验

Spring MVC最简单的配置 配置一个Spring MVC只需要三步: 在web.xml中配置Servlet: 创建Spring MVC的xml配置文件: 创建Controller和View 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 3 xmlns:xsi="http:

Xamarin.iOS开发初体验

Xamarin是一个跨平台开发框架,这一框架的特点是支持用C#开发IOS.Android.Windows Phone和Mac应用,这套框架底层是用Mono实现的. Mono是一款基于.NET框架的开源工程,包含C#语言编译器.CLR运行时和一组类库,能运行于Windows.Linux.Unix.Mac OS和Solaris.对于.NET程序员来说,Xamarin是走向安卓.iOS.Mac跨平台开发的神器,不仅能用熟悉的C#来开发,还能使用Visual Studio作为IDE.本文内容是Xamar

百度EChart3初体验

由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详细.大家可以去看下.大概了解下用法就OK. 百度ECharts 3:http://echarts.baidu.com/index.html 其实还有很多,可以到官网中找. 下面是我进行操作的步奏,大家可以看下,做个参考. ECharts初体验—01... 需要到官网下载最新的版本的js文件(完整版)

Windows Azure 初体验

最近看到windows azure 在做活动,只需花一块钱就可以体验一个月的windows azure. 于是,我就注册了一个账号也尝试一把云时代,传送门. 注册很简单的,成功后可以看到这个界面. 然后,我就研究了一下怎么把网站发布到云上,在此分享一下.网站是简单的基于asp.net mvc + code first 比较简单. 首先新建一个asp.net mvc 的网站.在此我命名为 WindowsAzureMVC,为了支持code first 需要添加entity framework 的dl