当前位置: 移动技术网 > IT编程>开发语言>.net > MVC使用Controller代替Filter完成登录验证(Session校验)学习笔记5

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

2017年12月12日  | 移动技术网IT编程  | 我要评论

交通银行个人网上银行登录,保定团购导航,日志心情

之前的学习中,在对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过滤更为高效,应对复杂需求时,灵活混用两种方法也不失为一种好的策略。

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网