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.

 

 

asp.net-mvc-filter

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博客园博客,原文链接:http://www.cnblogs.com/JustRun1983/p/3279139.html,如需转载请自行联系原作者


目录
相关文章
|
11月前
|
存储 安全 数据安全/隐私保护
Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
406 57
|
9月前
|
存储 前端开发 Java
【SpringMVC】——Cookie和Session机制
获取URL中参数@PathVarible,上传文件@RequestPart,HttpServerlet(getCookies()方法,getAttribute方法,setAttribute方法,)HttpSession(getAttribute方法),@SessionAttribute
213 11
|
11月前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
1018 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
|
10月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
210 4
|
10月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
12月前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
12月前
|
存储 安全 NoSQL
Cookie、Session、Token 解析
Cookie、Session、Token 解析
472 1
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
213 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
194 7