Asp.net MVC使用Filter解除Session, Cookie等依赖
本文,介绍了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的对象就可以了。
Asp.net MVC使用Filter解除Session, Cookie等依赖的更多相关文章
- [转]Asp.net MVC使用Filter解除Session, Cookie等依赖
本文转自:http://www.cnblogs.com/JustRun1983/p/3279139.html 本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应 ...
- Asp.net MVC使用Model Binding解除Session, Cookie等依赖
上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依赖"介绍了如何使用Filter来解除对于Session, Cookie的依赖.其实这个也可以通 ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- ASP.NET MVC学前篇之Lambda表达式、依赖倒置
ASP.NET MVC学前篇之Lambda表达式.依赖倒置 前言 随着上篇文章的阅读,可能有的朋友会有疑问,比如(A.Method(xxx=>xx>yy);)类似于这样的函数调用语句,里面 ...
- Asp.net mvc与PHP的Session共享的实现
最近在做的一个ASP.NET MVC的项目,要用到第三方的php系统,为了实现两个系统的互联互通.决定将两者的session打通共享.让asp.net mvc 和php 都能正常访问和修改Sessio ...
- ASP.NET MVC 过滤器Filter
在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能 判断登录与否或用户权限 决策输出缓存 防盗链 防蜘蛛 本地化与国际化设置 实现动态Action Filter是一种声明式编 ...
- ASP.NET MVC 使用Redis共享Session
储存模式 1.InProc模式 这是ASP.NET默认的Session管理模式,在应用进程内维护Session. 2.StateServer模式 这是在服务器装了.NET环境后自带的一个StateSe ...
- Asp.net mvc自定义Filter简单使用
自定义Filter的基本思路是继承基类ActionFilterAttribute,并根据实际需要重写OnActionExecuting,OnActionExecuted,OnResultExecuti ...
- ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)
上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...
随机推荐
- jQuery的目标
jQuery的开篇声明里有一段非常重要的话:jQuery是为了改变javascript的编码方式而设计的.从这段话可以看出jQuery本身并不是UI组件库或其他的一般AJAX类库.jQuery改变ja ...
- Java总结篇系列:Java多线程(二)
本文承接上一篇文章<Java总结篇系列:Java多线程(一)>. 四.Java多线程的阻塞状态与线程控制 上文已经提到Java阻塞的几种具体类型.下面分别看下引起Java线程阻塞的主要方法 ...
- Output data in a cursor
http://www.java2s.com/Code/SQL/Cursor/Outputdatainacursor.htm mysql> mysql> mysql> CREATE T ...
- GUID全局唯一标识符
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中. ...
- No suitable driver found for jdbc:mysql://localhost:3306/dmc
1. 使用java jdbc直接连接数据库操作, 出现题中错误, 参考网上说法, 将mysql连接jar放入jre拓展底下 不再报错
- HDU 1237 简单计算器 栈
额,题目是中文的,题意就不用说了= =都看懂喽.写个字符串先把这行计算式存进去,不过不能存一个算一个,因为考虑到乘除法比加减法优先的原则,如果是加号减号就先存着等待计算,如果是乘号除号就直接算出来值就 ...
- Fiddler 教程
Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有 ...
- IO复用_epoll函数
由于poll()和select()的局限,2.6内核以上引用了event poll机制(就是说的epoll),虽然比前2个实现复杂得多,epoll解决了它们共有的基本性能问题,并增加了新的特性. po ...
- Space.js – HTML 驱动的页面 3D 滚动效果
为了让我们的信息能够有效地沟通,我们需要创建用户和我们的媒体之间的强有力的联系.今天我们就来探讨在网络上呈现故事的新方法,并为此创造了一个开源和免费使用的 JavaScript 库称为 space.j ...
- Cytoscape.js – 用于数据分析和可视化的交互图形库
Cytoscape.js 是一个开源的 JavaScript 图形库,您可以使用 Cytoscape.js 进行数据分析和可视化.Cytoscape.js 可以轻松的继承到你的网站或者 Web 应用 ...