欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MVC使用Controller代替Filter完成登录验证(Session校验)学习笔记5

程序员文章站 2023-11-30 08:04:16
之前的学习中,在对session校验完成登录验证时,通常使用filter来处理,方法类似与前文的错误日志过滤,即新建filter类继承actionfilterattribu...

之前的学习中,在对session校验完成登录验证时,通常使用filter来处理,方法类似与前文的错误日志过滤,即新建filter类继承actionfilterattribute类,重写onactionexecuting方法,之后直接在需要验证的action前加上filter标记即可。

1. 新建登陆校验类checkloginattribute

using system.web.mvc;

namespace pms.webapp.models
{
  public class checkloginattribute:actionfilterattribute
  {
    public override void onactionexecuting(actionexecutingcontext filtercontext)
    {
      base.onactionexecuting(filtercontext);
      if (filtercontext.httpcontext.session == null || filtercontext.httpcontext.session["user"] == null)
      {
        filtercontext.httpcontext.response.redirect("/user/login");
      }
    }
  }
}

2. 在需要校验的action增加标记以完成校验

using system.web.mvc;
using pms.ibll;
using pms.webapp.models;

namespace pms.webapp.controllers
{
  public class usercontroller : controller
  {
    //
    // get: /user/
    //private iuserservice _userservice;
    //private iuserservice userservice
    //{
    //  get { return _userservice ?? (_userservice = new userservice()); }
    //  set { _userservice = value; }
    //}
    private iuserservice userservice { get; set; }
    [checklogin]
    public actionresult index()
    {
      return content("ok");
    }

  }
}

注意:不要在registerglobalfilters方法中注册校验类,否则则会相当于给所有action都添加了校验

这种方法使用起来需要在每个action方法前添加过滤标签,且效率并不十分高,我们的项目中使用的是一种更为简单高效的方法:使用controller进行登录验证

1.  新建一个用于验证的controller父类,并在其内重写onactionexecuting方法完成登陆校验:

using system.web.mvc;

namespace pms.webapp.controllers
{
  public class filtercontroller : controller
  {
    protected override void onactionexecuting(actionexecutingcontext filtercontext)
    {
      base.onactionexecuting(filtercontext);
      if (session["user"] == null)
      {
        //filtercontext.httpcontext.response.redirect("/user/login");
        filtercontext.result = redirect("/user/login");
      }
    }
  }
}

在controller校验类的onactionexecuting方法中,有如下代码

//filtercontext.httpcontext.response.redirect("/user/login");
filtercontext.result = redirect("/user/login");      

我们使用后者而放弃前者的原因是,asp.net mvc中规定,action必须返回actionresult,如果使用前者,在完成跳转前会先进入到请求的页面,这样不符合我们使用过滤器的初衷。

2.  然后使需要校验的controller继承于我们定义的校验controller即可完成全局登录校验操作:

using system.web.mvc;
using pms.ibll;

namespace pms.webapp.controllers
{
  public class usercontroller : filtercontroller//controller
  {
    //
    // get: /user/
    //private iuserservice _userservice;
    //private iuserservice userservice
    //{
    //  get { return _userservice ?? (_userservice = new userservice()); }
    //  set { _userservice = value; }
    //}
    private iuserservice userservice { get; set; }
    //[checklogin]
    public actionresult index()
    {
      return content("ok");
    }

  }
}

下面我们对比两种方法的优缺点

      filter定义过程比较复杂,效率也稍低些,但是却可以对每一个action进行单独的过滤,同一action也可以有多条过滤信息,使用比较灵活。

      controller定义更为简便,效率高,但是却只能对整个controller中所有方法进行过滤,同一controller也不太容易有多个controller过滤父类。

     综上所述,实际项目中大多需求都是同一controller下所有方法都需要完成登陆验证,所以其实使用controller过滤更为高效,应对复杂需求时,灵活混用两种方法也不失为一种好的策略。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。