本文转自:http://www.cnblogs.com/JustRun1983/p/3279139.html

本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应用场景。 同时针对MVC中的对于Session,Cookie等的依赖,如何使用Filter解依赖。

如果大家有什么好的Filter应用方法,希望一起多交流。

阅读目录:

一、Filter在MVC生命周期中的位置

二、Filter常见的应用场景

三、Filter的执行顺序

四、MVC中常见的对于Session, Cookie的依赖

五、使用Filter解除依赖

1. Filter在MVC生命周期中的位置

下面的图中, 一个完成的MVC的生命周期分为5个步骤, 对应图例中的1~5

  • IIS中传递请求到程序
  • MVC根据Routing来选择由哪个Controller/Action来处理
  • Controller调用Model(业务逻辑)来处理数据
  • Controller选择一个View, 同时把需要呈现的数据交给View Engine呈现
  • 最后,返回最终的Response到客户端

Filter在MVC的生命周期中的角色就像是一个一个的截面,在MVC的处理过程中,拦截请求。

Filter分为:

Authorization filters – 需要实现IAuthorizationFilter接口,用于验证处理验证相关的操作

Action filters –需要实现IActionFilter接口. 在Action处理的开始和结束做拦截操作

Result filters – 需要实现IResultFilter接口. 在View呈现前和呈现后做处理

Exception filters – 需要实现IExceptionFilter接口,只要是添加了Exception Filter的请求中出现异常,都会被拦截

每个Filter的作用时机,对应于下图中的2a, 2b, 4a, 4b.

2. Filter常见的应用场景

下面是个人在开发中,常用到的Filter处理:

  • 权限验证

使用Authorization filters,拦截请求,在进入到Controller处理之前,验证用户是否登录或者登录用户是否有权限访问改页面。

如果合法,就继续交由Controller处理,如果非法,中断流程,跳转到登录页面。

  • 日志记录

通过Action Filter跟踪记录Action处理开始的时间,结束时间,访问的具体Controller和Action, 参数,访问者ip等信息。

  • 异常处理

异常处理Exception filter能够在发生异常的时候,记录异常信息。如果是session过期引起的异常,则跳转到登录页面,如果是程序运行导致的无法处理异常,则跳转到友好的错误页面。

  • 提升SEO效果

每篇博客文章的meta信息能够帮助提高SEO效果,但是很多人对于填写keyword, description等信息觉得太繁琐。

可以使用Result filters,在最后呈现页面前,使用程序分析内容,提取keyword和description来,然后填充到meta信息中。

这样,每篇博客文章都能够有程序实现最佳的SEO效果,甚至生成一份SEO报告出来。

3. Filter的执行顺序

Filter之间执行的顺序,首先根据类型区分:

分别是Authorization filters, Action filters, Result filters. Exception Filter没有列入的原因是, 它是在发生异常的时候处理,没有特定的顺序。

当同时一个类型的Filter的时候,执行顺序可以通过Filter的Order属性来排序。

4. MVC中常见的对于Session, Cookie的依赖

在Web程序中,对于Session和Cookie等的使用是必不可少的。

比如, 很多的Action的代码中,会要从Session中获取当前登录用户信息:

public ActionResult Index()
{
var user = Session[“UserAccuont”];//从Session中获取当前登录用户的信息
//send email
var email = user.Email;
…………
}

上面的Index方法的问题就是和Session耦合,很难单元测试。

下面介绍如何使用Filter来解除对于Session的依赖。

5. 使用Filter解除依赖

添加一个SessionUserParameterAttribute的Action Filter, 它的功能是:

从Session中取得User, 将取得的User赋值给Action中的参数sessionUser.

public class SessionUserParameterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
const string key = "sessionUser"; if (filterContext.ActionParameters.ContainsKey(key))
{
filterContext.ActionParameters[key] = Session[“UserAccuont”];//为Action设置参数
} base.OnActionExecuting(filterContext);
}
}

改造后的Index Action方法如下:

[SessionUserParameter]
public ActionResult Index(UserAccount sessionUser)
{
//send email
var email = sessionUser.Email;
…………
}

这样Index方法就解除了对于Session的依赖, 而只是依赖于一个普通的实体类UserAccount.

在单元测试中,只需要简单的构造一个UserAccount的对象就可以了。

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。 如果,您希望更容易地发现我的新博客,不妨点击一下右下角的关注 Justrun。 因为,我的写作热情也离不开您的肯定支持。

感谢您的阅读,这里还有你可能感兴趣的文章推荐博客文章

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名justrun(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言

[转]Asp.net MVC使用Filter解除Session, Cookie等依赖的更多相关文章

  1. Asp.net MVC使用Filter解除Session, Cookie等依赖

    本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应用场景. 同时针对MVC中的对于Session,Cookie等的依赖,如何使用Filter解依赖. 如果大家有 ...

  2. Asp.net MVC使用Model Binding解除Session, Cookie等依赖

    上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依赖"介绍了如何使用Filter来解除对于Session, Cookie的依赖.其实这个也可以通 ...

  3. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

  4. ASP.NET MVC学前篇之Lambda表达式、依赖倒置

    ASP.NET MVC学前篇之Lambda表达式.依赖倒置 前言 随着上篇文章的阅读,可能有的朋友会有疑问,比如(A.Method(xxx=>xx>yy);)类似于这样的函数调用语句,里面 ...

  5. ASP.NET MVC 过滤器Filter

    在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能 判断登录与否或用户权限 决策输出缓存 防盗链 防蜘蛛 本地化与国际化设置 实现动态Action Filter是一种声明式编 ...

  6. Asp.net mvc自定义Filter简单使用

    自定义Filter的基本思路是继承基类ActionFilterAttribute,并根据实际需要重写OnActionExecuting,OnActionExecuted,OnResultExecuti ...

  7. Asp.net mvc与PHP的Session共享的实现

    最近在做的一个ASP.NET MVC的项目,要用到第三方的php系统,为了实现两个系统的互联互通.决定将两者的session打通共享.让asp.net mvc 和php 都能正常访问和修改Sessio ...

  8. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  9. ASP.NET MVC 使用Redis共享Session

    储存模式 1.InProc模式 这是ASP.NET默认的Session管理模式,在应用进程内维护Session. 2.StateServer模式 这是在服务器装了.NET环境后自带的一个StateSe ...

随机推荐

  1. 图解.NET Stack和Heap的本质区别

    现在越来越觉得对.NET基本概念的理解和掌握对于提升编程水平的重要性,先从.NET的 Stack(栈)和Heap(堆)说起,计算机的内存可以分为代码块内存,stack内存和heap内存.代码块内存是在 ...

  2. Node.js Web 开发框架大全《中间件篇》

    这篇文章与大家分享优秀的 Node.js 中间件模块.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处 ...

  3. 携带cookie进行数据请求

    前端进行数据请求有:普通的ajax(json)请求,jsop跨域请求,cors跨域请求,fetch请求...PC端这些请求方式中,普通的ajax(json)请求和jsop跨域请求是默认携带cookie ...

  4. ABAP中的数据校验-备注

    通过 function module 检查日期是否合法(DDUT_INPUT_CHECK的校验会根据账户的时间设置格式)     日期校验方式一: CALL FUNCTION ‘DATE_CHECK_ ...

  5. arcgis批量处理mxd定义服务中的路径

     >>> from arcpy import env... env.workspace=r"c:\165mxd"... out = r"c:\166mx ...

  6. iis7.5安装配置php环境

    前言 iis7.5是安装在win7.win8里的web服务器,win2003.win2000的web服务器使用的是iis6.0,由于win7.win8系统相比win2003.win2000有了改新革面 ...

  7. NSString和SwiftString的区别和使用场景

    当下Swift项目已经越来越多,可能会经常见到  str as NSString 或者 str as String 字符串在这两者之间的来回切换,因为有些操作用OC字符串比较方便,而有些操作则相反,熟 ...

  8. 深入浅出Block的方方面面

    内容大纲: 1.Blocks概要 2.Blocks模式 3.Block实质(面试常问重点) 1.Blocks概要 什么是Blocks:Blocks是C语言的扩充的功能,可以用一句话来表示Blocks的 ...

  9. 新版微耕软件(N3000)与旧版2000的实体功能区别

    更多细节请参阅其软件操作说明书. 建议:基于安全的应用始终变化不断,软件投入一直无法满足客户的定制化要求.不如提供基本的SDK,接口,允许第三方以插件的形式开发控制界面.报表. 软件只提供核心的界面. ...

  10. nutz的json视图

    2.3. json视图 返回json视图有两种方法: @Ok("json")  与@Ok(“raw:json”) 2.3.1. @Ok("json") (1) ...