本文,介绍了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 emailvar 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 emailvar email = sessionUser.Email;…………
}

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

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

转载于:https://www.cnblogs.com/JustRun1983/p/3279139.html

Asp.net MVC使用Filter解除Session, Cookie等依赖相关推荐

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

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

  2. [asp.net mvc]自定义filter

    写在前面 最近在摸索mvc,在app中的webview中嵌入h5应用,经常需要用到对cookie的读取操作.所以想到通过自定义的filter截取cookie,然后通过在action上面打特性的方式针对 ...

  3. 使用Filter跟踪Asp.net MVC页面加载(转)

    转载地址:http://www.cnblogs.com/JustRun1983/p/4027929.html 最近,客户一直反馈系统使用慢,有时候能够指出具体是哪个页面,有时候又只是笼统地反馈慢.这种 ...

  4. Asp.net MVC Filter解析和实例说明

    解析目录 一.Filter在MVC生命周期中的位置 二.Filter常见的应用场景 三.Filter的执行顺序 四.MVC中常见的对于Session, Cookie的依赖 五.使用Filter解除依赖 ...

  5. ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)

    本系列文章基于ASP.NET MVC Preview5. 前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继 ...

  6. [MVC]Asp.net MVC中的Session

    [MVC]Asp.net MVC中的Session 2008年12月9日 分类: ASP.NET, ASP.NET MVC, C#, 开发笔记 最近使用ASP.NET MVC 中的Controller ...

  7. log功能ASP.NET MVC能实现

    ASP.NET MVC的filter 是一个属性,可以应用到controller 后者action.当Controller或者action method 被调用时,ASP.NET MVC的filter ...

  8. html中body引入js,ASP.NET MVC中在 @RenderBody() 或者 @Html.Partial()中需要使用引入外部js,css...

    今天想在后台封装一下bootstraptree这个插件,引入jquery.js bootstrap.js bootstrap.css bootstrap-tree.js后,我在页面查看脚本错误就连最简 ...

  9. 《Pro ASP.NET MVC 3 Framework》学习笔记之五【依赖注入及ninject工具使用】

    一,创建松耦合的组件 1."分解关注点"是MVC模式里面一个非常重要的特性.我们想要在应用程序里面创建的组件尽可能的独立,这样我们就能管理比较少的依赖关系.理想情况下,每个组件都是 ...

最新文章

  1. 刘强东:这4类员工必须尽快清除!
  2. 用于面包板的双列直插需要多宽?
  3. python所有模块图解_Python模块结构和布局
  4. stm32cubeide ST-LINK_gdbserver _ZTINSt8ios_base7failureB5cxx11E libstdc++.so.6问题解决
  5. Linux命令行中的特殊符号_特殊字符
  6. 请谈下Android消息机制,复习指南
  7. Linux的简介与虚拟机的管理
  8. c打开指定路径文件_Selenium 系列篇(五):文件篇
  9. 的it生活_IT行业是干啥的
  10. 面试题:原型Bean在一个线程多次获取是否一样?
  11. 杀猪、打狗、护牛、赛马、放虎——几种管理方法
  12. 从Netty基础到聊天系统和RPC实战-卷二
  13. 学计算机平面设计需不需要写生,计算机平面设计毕业论文
  14. Excel2010重复打印标题行
  15. opencv-python(cv2)——如何读取和保存中文路径图片(含代码)
  16. 阿里云服务器 远程桌面连接 卡顿
  17. 015污点修复画笔工具,修复画笔工具,修补工具,内容感知移动工具和红眼工具...
  18. FrontEnd笔记 -- JavaScript
  19. 【python】No such file or directory的解决方法
  20. 【私人订制Python模块库】Pyemail:更方便快捷地发送电子邮件

热门文章

  1. weblogic修改banner_WeblogicScanV1.3
  2. python搭建webapi_怎么搭建Web Api
  3. win10微软图标点击无反应_win10开始菜单,不出来,任务栏右击无反应
  4. Linux crond 每分钟,每小时,每天,每周,每月,每年 的表达式写法
  5. SpringCloud Ribbon之概述(一)
  6. Centos7 重启网卡
  7. 在分布式环境中解决session共享问题
  8. 作者:张悦今,女,中央财经大学信息学院讲师。
  9. 【系统设计】发现类的方法
  10. 【数字逻辑设计】Logisim构建全加器