AspNet MVC3中过滤器 + 实例
AspNet MVC3中过滤器 + 实例
过滤器在请求管线注入额外的逻辑,提供简单优雅的方法实现横切点关注(AOP),例如日志,授权,缓存等应用.通过AOP可以减少在实际的业务逻辑中参杂过多非直接业务逻辑功能的代码,让某个行为或者动作更加专注于自身的功能逻辑,例如统计Action,专注于数据的统计分析而不要关注日志以及调用的身份验证和授权问题.
1.过滤器类型
AspNet MVC中包含三种常用的过滤器分别是:Action(行为过滤器) , Result(结果过滤器) ,Exception(异常过滤器)和Authorization(授权过滤器).
| --------------------------------------------------------------------------------------|
| 过滤器类型 | 对应接口 | 描述 |
-----------------------------------------------------------------------------------------
| Authorization IAuthorizationFilter 用于实现用户验证和对Action的访问授权,例如默认的Authorize过滤器
| Action IActionFilter 用于对Action执行前后的逻辑控制,例如修改参数,返回数据controller
| Result IResultFilter 用于修改视图向浏览器展现的结果,通过对ViewReuslt生成前后逻辑控制
| Exception IExceptionFilter 用于处理行为和结果的错误,日志的记录
过滤器的默认执行顺序为Authorization > Action > Result > Exception ,如果需要修改只执行的顺序可以通过修改Order属性来实现.
2. AspNet MVC提供的集中默认过滤器
a. Authorize 用户当前用户登录验证,通过匹配用户名和角色(roles)实现
b. ChildActionOnly 指定当前行为(Action)是某个请求的一部分。
c. OutputCache 控制页面数据的缓存
d. HandleError 页面访问的异常/错误处理,在页面或者行为数据错位时候可以导航到指定的错误页面
3.定制过滤器
用户定制过滤器主要需要实现或者重写一些方法比如:
OnAuthorization 身份验证/访问授权
OnException 异常错误处理
OnActionExecuting 调用Action前
OnActionExecuted 调用Action后
OnResultExecuting 生成ViewResult前
OnResultExecuted 生成ViewResult后
实现途径有两种方式: 一种是通过继承ActionFilterAttribute或者AuthorizeFilterAttribute等类,然后重写对应的逻辑方法,还有一种就是如1中描述的,通过实现一些类似IActionFilter或者ResultFilter等接口来实现,第二种实现相对来说较底层.
例如要实现多某个行为Action的拦截,可以通过继承IActionFilter或者ActionFilterAttribute实现方法OnActionExecuting和OnActionExecuted在请求访问到达指定的Action前对请求进行处理和对访问后返回数据的处理
4.过滤器应用
这里主要演示对Action行为的拦截,一个是针对Action参数的拦截,判断访问请求数据是否包含敏感字眼一个通过action的身份授权验证
如果要直接在行为Action上使用类似属性那般在继承对应的接口时候还要继承类FilterAttribute
a. 敏感字眼的过滤
主要实现OnActionExecuting方法,在请求达到action前先对请求的参数进行过滤,通过指定的过滤算法将参数信息进行过滤替换

   public class CustomActionFilterAttribute : IActionFilter {
        public void OnActionExecuted(ActionExecutedContext filterContext) {
        }
        public void OnActionExecuting(ActionExecutingContext filterContext) {
            //对参数的过滤,例如处理一些比较敏感的信息
            //s1: 获取参数信息 ,得到参数的个数以及每个参数的类别
            filterContext.ActionDescriptor.GetParameters();
            //s2: 获取参数值,返回一个字典
            //parameterValue 参数值 , parameterName 参数名
            var parameterValue = filterContext.ActionParameters[parameterName];
            //s3: 敏感信息过滤
            // 过滤算法
            // 过滤后赋值
            filterContext.ActionParameters[parameterName] = newParameterValue;
        }
    }

b. 访问授权

  public class AuthenticationFilterAttribute:IActionFilter{
        public void OnActionExecuted(ActionExecutedContext filterContext) {
            //throw new NotImplementedException();
        }
        public void OnActionExecuting(ActionExecutingContext filterContext) {
            // 未认证直接重定向到登录页面,并设置登录成功后的目标URL
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated) {
                string redirect_string = filterContext.HttpContext.Request.Url.AbsolutePath;
                //设置登录成功后转向的URL,格式例如:http://xxx.xxx/login.aspx?ReturnUrl=www.swzsoft.cn
                string returnUrl = string.Format("?ReturnUrl={0}", redirect_string);
                //重定向到登录的URL后面的returnUrl参数用于登录通过后的页面跳转
                string loginUrl = System.Web.Security.FormsAuthentication.LoginUrl + returnUrl;
                filterContext.HttpContext.Response.Redirect(loginUrl, true);
            }
        }
    }

基于角色的访问授权

    public class BaseOnRolesAuthenticationFilterAttribute:FilterAttribute, IActionFilter{
        public void OnActionExecuted(ActionExecutedContext filterContext) {
            //throw new NotImplementedException();
        }
        public string Role{get;set;}
        public BaseOnRolesAuthenticationFilterAttribute(string role){
            Role = role;
        }
        public void OnActionExecuting(ActionExecutingContext filterContext) {
            if (!string.IsNullOrEmpty(Role)) {
                // 未认证直接重定向到登录页面,并设置登录成功后的目标URL
                if (!filterContext.HttpContext.User.Identity.IsAuthenticated) {
                    string redirect_string = filterContext.HttpContext.Request.Url.AbsolutePath;
                    //设置登录成功后转向的URL,格式例如:http://xxx.xxx/login.aspx?ReturnUrl=www.swzsoft.cn
                    string returnUrl = string.Format("?ReturnUrl={0}", redirect_string);
                    //重定向到登录的URL后面的returnUrl参数用于登录通过后的页面跳转
                    string loginUrl = System.Web.Security.FormsAuthentication.LoginUrl + returnUrl;
                    filterContext.HttpContext.Response.Redirect(loginUrl, true);
                }
                else {
                    bool bIsAuthorized = filterContext.HttpContext.User.IsInRole(this.Role);
                    if (!bIsAuthorized) {
                        throw new UnauthorizedAccessException("");
                    }
                }
            }else{
                throw new InvalidOperationException("");
            }
        }
    }
    // 应用,针对某个Controller的某个Action
    [BaseOnRolesAuthenticationFilter("Andy")]
    public ActionResult AdminIndex() {
            ViewBag.Msg = "Amdin INdex";
            return View();
     }

AspNet MVC3中过滤器 + 实例的更多相关文章
- AngularJS 表达式中添加过滤器实例
		
过滤器可以通过一个管道字符(|)和一个过滤器添加到表达式中 历练实例: <!DOCTYPE html><html><head><meta http-equiv ...
 - AspNet MVC中各种上下文理解
		
0 前言 AspNet MVC中比较重要的上下文,有如下: 核心的上下文有HttpContext(请求上下文),ControllerContext(控制器上下文) 过滤器有关有五个的上下文Actio ...
 - ASP.NET MVC3中Controller与View之间的数据传递总结
		
一. Controller向View传递数据 1. 使用ViewData传递数据 我们在Controller中定义如下: ViewData["Message_ViewData& ...
 - ASP.NET MVC3中Controller与View之间的数据传递
		
在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一. Controller向Vie ...
 - flask中过滤器的使用
		
过滤器 过滤器的本质就是函数.有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化.运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器. 使用方 ...
 - 黑马vue---31-32、vue过滤器实例
		
黑马vue---31-32.vue过滤器实例 一.总结 一句话总结: vue内部的东西,无论是过滤器还是组件,都是键值对的方式 1.过滤器的定义语法? Vue.filter('过滤器的名称', fun ...
 - 【5min+】AspNet Core中的全局异常处理
		
系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...
 - 关于Javascript中通过实例对象修改原型对象属性值的问题
		
Javascript中的数据值有两大类:基本类型的数据值和引用类型的数据值. 基本类型的数据值有5种:null.undefined.number.boolean和string. 引用类型的数据值往大的 ...
 - MVC3中如何输出富文本
		
MVC3中如何输出富文本 在网站的文本输出中,经常会将DB里的文本输出到页面上. 一般来说是直接利用MVC3中的ViewBag将文本带到前台并表示, 或是是直接以<%:model.data%&g ...
 
随机推荐
- 抄360于Launcher浮动窗口的屏幕显示内存使用情况(改进版)
			
MainActivity例如下列: package cc.cc; import android.os.Bundle; import android.view.View; import android. ...
 - 自由软件之父、Google+设计者、Java之父、Linux之父、万维网之父、Vi编辑器之父、苹果Lisa电脑界面设计、微软首席软件架构师
			
自由软件之父.Google+设计者.Java之父.Linux之父.万维网之父.Vi编辑器之父.苹果Lisa电脑界面设计.微软首席软件架构师 理查德·斯托曼(Richard Stallman) 理查德· ...
 - Factorization Machines 学习笔记(二)模型方程
			
近期学习了一种叫做 Factorization Machines(简称 FM)的算法,它可对随意的实值向量进行预測.其主要长处包含: 1) 可用于高度稀疏数据场景:2) 具有线性的计算复杂度.本文 ...
 - Android安卓安全审计mobiseclab
			
关于安卓上的app分析,有非常多的本地化软件能够胜任, 只是,今天给大家介绍一款在线的安全审计,恶意软件(android app)检測和分析工具,mobiseclab, 由于看到国内对此工具的介绍比較 ...
 - 认识ASP.NET MVC6
			
认识ASP.NET MVC6 这篇文章说明下如何在普通编辑器下面开发mvc6应用程序. 上篇文章: 十分钟轻松让你认识ASP.NET 5(MVC6) 首先安装mvc6的nuget包: 可以看到在pro ...
 - 第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例(原创)
			
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...
 - Asp.net vNext 2
			
Asp.net vNext 学习之路(二) View component(视图组件)应该是MVC6 新加的一个东西,类似于分部视图.本文将演示在mvc 6中 怎么添加视图组件以及怎么在视图中注入一个服 ...
 - jQuery的ready方法实现原理分析
			
jQuery中的ready方法实现了当页面加载完成后才执行的效果,但他并不是window.onload或者doucment.onload的封装,而是使用 标准W3C浏览器DOM隐藏api和IE浏览器缺 ...
 - VC++.Net CAD编程架构
			
1.每个对应的菜单项的图形抽象的, 图形抽象基类, 取决于改变来自子(如矩形.椭圆形) 2.在Doc对象管理列表管理,图形对象,当图形需要重绘或序列存储,通过遍历该列表的对象可以是 3. 每个类的职责 ...
 - 快速构建Windows 8风格应用26-本地应用数据
			
原文:快速构建Windows 8风格应用26-本地应用数据 本篇博文主要介绍如何获取应用的设置和文件容器.如何将数据写入设置.如何从设置中获取数据.如何删除设置中数据.如何将数据写入文件.如何从文件中 ...