ASP.NET MVC学习之过滤器(一)

一、前言

继前面四篇ASP.NET
MVC
的随笔,我们继续向下学习。上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面。

二、正文

以下的示例建立在ASP.NET MVC
4
之上(VS2012)

1.授权过滤器

只要涉及用户的网站,都一定会涉及到什么权限的用户可以访问哪个页面。对于新手而言可能都在每个页面中单独写这个功能方法,导致的后果就是大量重复的代码,并且不便于以后的变动。有用一定经验之后,就会采用集中控制的方式,让所有的页面先执行特定的方法去判断,这样的优点就是减少了代码的重复,同时也能够灵活的配置。但是对于某些拥有特殊需求的页面就有点力所不能及,而且这种权限判断的代码会和页面的逻辑代码混为一体,难以区分。而今天介绍的授权过滤器是采用注解属性的方式去控制每个动作,并且可以灵活的配置。

首先我们在网站根目录新建一个Filter文件夹,在其中新建一个CustAuthorizeAttribute类,类中的具体代码如下所示


 1 namespace MvcStudy.Filter
2 {
3 public class CustAuthorizeAttribute : AuthorizeAttribute
4 {
5 private string[] roles;
6
7 public CustAuthorizeAttribute(params String[] role)
8 {
9 roles = role;
10 }
11
12 protected override bool AuthorizeCore(HttpContextBase httpContext)
13 {
14 String role = httpContext.Request.QueryString["role"];
15 if (role != null)
16 {
17 return roles.Contains(role);
18 }
19 return base.AuthorizeCore(httpContext);
20 }
21 }
22 }

通过上面的代码我们知道这个过滤器将会在使用时要求使用者传入可以访问的角色有哪些,其中最终的是AuthorizeCore方法,该方法是负责判断当前的请求是有具有权限,这里我们为了演示,所以直接根据查询字符串的role的值来判断。

既然我们已经有了过滤器,下面我们新建一个Home控制器,并在Views下新建一个Home文件夹,同时在Home文件夹下新建名为Index的视图以及List的视图。接着我们打开Home控制器。

在其中写入如下代码


 1 namespace MvcStudy.Controllers
2 {
3 public class HomeController : Controller
4 {
5 [CustAuthorize("vip")]
6 public ActionResult Index()
7 {
8 return View();
9 }
10
11 [CustAuthorize("admin")]
12 public ActionResult List()
13 {
14 return View();
15 }
16 }
17 }

我们可以看到笔者将Index动作规定为只有rolevip才能访问,而List则是admin。接着我们运行项目,浏览器会默认打开http://localhost:7575/(端口请根据实际情况而定),但是你会发现你将会被转移到http://localhost:7575/Account/Login?ReturnUrl=%2f这个页面,因为项目中我们并没有新建这个视图,所以会报404错误。而这个是被通过授权后ASP.NET
MVC
默认的行为,当然我们可以改变这个行为,下面我们来改变这个行为,让其直接跳转到Login视图,修改CustAuthorizeAttribute类。

代码如下所示:


 1 namespace MvcStudy.Filter
2 {
3 public class CustAuthorizeAttribute : AuthorizeAttribute
4 {
5 private string[] roles;
6
7 public CustAuthorizeAttribute(params String[] role)
8 {
9 roles = role;
10 }
11
12 protected override bool AuthorizeCore(HttpContextBase httpContext)
13 {
14 String role = httpContext.Request.QueryString["role"];
15 if (role != null)
16 {
17 return roles.Contains(role);
18 }
19 return base.AuthorizeCore(httpContext);
20 }
21
22 protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
23 {
24 UrlHelper url = new UrlHelper(filterContext.RequestContext);
25 filterContext.Result = new RedirectResult("/Login");
26 }
27 }
28 }

其中关键的是我们重写了HandleUnauthorizedRequest方法,这个方法只有在AuthorizeCore返回false情况才会调用,同时该方法的参数中有一个Result属性,该属性是将最终的处理结果赋给它。

重新编译,我们继续访问默认的路径,这个时候我们可以发现转移的路径已经变成了http://localhost:7575/Login,到这里我们已经可以处理授权失败的情况了,现在我们就要开始测试几个正确的结果首先是Index,我们只需要访问该路径即可http://localhost:7575/Home/Index?role=vip(同http://localhost:7575/?role=vip),如果要访问List,我们就需要访问这个路径http://localhost:7575/Home/List?role=admin,通过这个简单的例子,我们就可以知道在ASP.NET
MVC中是通过何种方式去控制用户访问页面的权限。

2.异常过滤器

在我们的开发过程我们很多的时间都在修改异常,防止异常的发生。但是在实际的运行过程中总会发生很多我们未曾发现的问题,以及其他恶意的攻击。这个时候我们就需要一个统一的机制可以控制并处理这些异常,或许我一说到异常很多人都会联想到try{}catch{},的确没错,异常的捕获是用他们,但是你有没有想过,如果一个网站导出充斥着try{}catch{},不仅仅是不美观,同时也能以控制。而ASP.NET
MVC
为我们提供了异常过滤器,可以为每个动作添加这个注解属性,这样我们就可以灵活的控制并处理这些异常。

首先我们在Filter文件中新建一个CustExceptionAttribute类,并在其中写入如下的代码


 1 namespace MvcStudy.Filter
2 {
3 public class CustExceptionAttribute : FilterAttribute , IExceptionFilter
4 {
5 public void OnException(ExceptionContext filterContext)
6 {
7 if (!filterContext.ExceptionHandled)
8 {
9 filterContext.Result = new RedirectResult("error.html");
10 filterContext.ExceptionHandled = true;
11 }
12 }
13 }
14 }

我们可以看到这里我们依然还是用Result来将我们处理后的结果赋值给它,但是我们这里还判断了ExceptionHandled属性,这个属性的含义是如果其他的异常过滤器已经处理了该异常,则该属性的值为true,为了能够适应大的范围,所以笔者这里建议读者也要先判断是否已经有其他的异常过滤器已经处理过这个异常了。

下面我们在Home控制器中的Index动作中使用:


 1 namespace MvcStudy.Controllers
2 {
3 public class HomeController : Controller
4 {
5 [CustException()]
6 public ActionResult Index()
7 {
8 throw new NullReferenceException();
9 return View();
10 }
11 }
12 }

这个时候我们访问http://localhost:7575/将会跳转至http://localhost:7575/error.html页面(因为笔者没有建这个页面所以会显示404),但是读者可以看到这里我仅仅只是根据异常跳转到一个特定的页面,其实ASP.NET
MVC
中已经默认为我们实现了这个注解属性,这个注解属性就是HandleError类,我们只需要传入需要捕获的异常类型,以及对应的页面即可。

下面我们修改Home控制器的Index动作:


 1 namespace MvcStudy.Controllers
2 {
3 public class HomeController : Controller
4 {
5 [HandleError(ExceptionType=typeof(NullReferenceException),View="error")]
6 public ActionResult Index()
7 {
8 throw new NullReferenceException();
9 return View();
10 }
11 }
12 }

然后我们重新编译,并访问页面,会发现页面没有按照我们的预想跳转到特定的页面而是直接显示了错误的详情。这是因为ASP.NET
MVC
默认情况下没有开启自定义异常处理,所以就会出现这个默认的页面,下面我们修改Web.Config在其中添加如下的配置

这时我们重新编译刷新页面,但是我们会发现页面会有内容,因为这个页面调用的是Views/Shared/Error.cshtml页面。

未完待续…

ASP.NET MVC学习之过滤器(一),布布扣,bubuko.com

时间: 2024-10-26 03:40:19

ASP.NET MVC学习之过滤器(一)的相关文章

ASP.NET MVC学习之过滤器篇(2)

下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成之后更改最终返回的结果,当然很多人一定不太明白这个到底可以干什么, 下面我们举一个比较实际的例子: 相信理解过网站的安全的一定知道跨站请求(CSRF具体可以自行百度,这里我就不去解释了),当然也有解决方案,那就是给页面中增加一个识别码,当页面进行POST请求时,首先判断识别码是否正确, 如果正确则继

ASP.NET MVC学习之过滤器篇(1)

一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC 4之上(VS2012) 1.授权过滤器 只要涉及用户的网站,都一定会涉及到什么权限的用户可以访问哪个页面.对于新手而言可能都在每个页面中单独写这个功能方法,导致的后果就是大量重复的代码,并且不便于以后的变动.有用一定经验之后,就会采用集中控制的方式,让所有的页面先执行特定的方法去判断,这样的优点就

ASP.NET MVC学习之Ajax(完结)

一.前言 通过上面的一番学习,大家一定收获不少.但是总归会有一个结束的时候,但是这个结束也意味着新的开始. 如果你是从事ASP.NET开发,并且也使用了第三方控件,那么一定会觉得ASP.NET开发ajax十分的简单,而ASP.NET MVC学习到现在页面都是刷新的,所以这节就是ASP.NET MVC的最后一节,通过这节的学习我们将能够实现通过ajax提交表单,下面我们开始继续学习. 二.准备工作 1.首先确保引用了以下js库在_Layout中: 2.新建一个HomeController,然后在其

ASP.NET MVC学习---(九)权限过滤机制(完结篇)

相信对权限过滤大家伙都不陌生 用户要访问一个页面时 先对其权限进行判断并进行相应的处理动作 在webform中 最直接也是最原始的办法就是 在page_load事件中所有代码之前 先执行一个权限判断的方法 至于其专业的权限机制这里不做讨论 想要了解的同学可以自行google之 或者点击进入: webform专业的权限验证机制 那么mvc中是如何实现权限验证的? 据我们所知 mvc中是根据路由配置来请求控制器类中的一个方法 并没有webform中的page_load方法 难道我们要在每个actio

ASP.NET MVC学习目录

一.ASP.NET MVC原理详解 1.了解MVC架构模式 3.学习ASP.NET MVC的必备语言知识 4.MVC中的razor语法详解 5.ASP.NET MVC路由系统机制详细讲解 6.ASP.NET MVC输出生成Url链接详解 7.自定义ASP.NET MVC路由系统截获MVC的路由请求 8.ASP.NET MVC使用Area区域,使用功能模块清晰明了 9.ASP.NET MVC的Controller介绍 10.ASP.NET MVC的Controller接收输入详解 11.ASP.N

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

ASP.NET MVC学习之控制器篇

一.前言 许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解. ASP.NET MVC学习之路由篇幅(1) ASP.NET MVC学习之路由篇幅(2) ASP.NET MVC学习之路由篇幅(3) 二.正文 1.IController的使用 这个接口可能很多人都没有使用过,但是我们常用的Controller类实现了这个接口,而且只要实现这个接口就可以作为一个控制器,当然很多的内部的处理就要我们自己去做了. 下面我利用ICont

Asp.Net MVC学习记录之“一个实体对象不能由多个 IEntityChangeTracker 实例引用”

原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. ? 1 2 3 4 5 var re = /\d/; console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1"

(转)ASP.NET MVC 学习第一天

天道酬勤0322 博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅  | 管理 随笔:10 文章:0 评论:9 引用:0 ASP.NET MVC 学习第一天 今天开始第一天学习asp.net mvc,写的不是很好,高手不要喷,希望大家能一起进步学习. 好了,开始学习 新建项目,选择mvc 4应用程序 接下来选择基本,视图引擎当然要选择Razor,如果在选择aspx那我们就没必要用mvc喽 在这里我们简单说一下,项目模板如果选择空,这就需要我们自己进行导入很多文件,而选择基本vs会