MVC使用Controller代替Filter完成登录验证(Session校验)学习笔记5
之前的学习中,在对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过滤更为高效,应对复杂需求时,灵活混用两种方法也不失为一种好的策略。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: vue生命周期的探索
下一篇: iOS自定义时间滚动选择控件