zoukankan      html  css  js  c++  java
  • 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的对象就可以了。

  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/JustRun1983/p/3279139.html
Copyright © 2011-2022 走看看