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

Session登录验证

程序员文章站 2024-03-20 18:07:28
...

最近看到一篇帖子是自己写一个简单的mvc框架挺有意思的http://www.cnblogs.com/edisonchou/p/5211645.html
突然想到自己之前在做用户登录验证方面还可以再改进一下

先说应该怎么做吧
新建一个BaseController继承Controller,然后其他业务控制器继承BaseController(LoginController直接继承Controller,不然会循环),其实这个BaseController作用很大的,不光可以做登录验证,我之前有用它做过权限控制。
在BaseController中重写OnActionExecuted方法,参考自https://blog.csdn.net/zy0421911/article/details/51284145

我的代码:

public class BaseController : Controller
    {
        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            if (Session["userid"] == null)
            {
                filterContext.Result = Redirect("/Login/Index");
            }
        }
    }

另外在LoginController的登录页写个重定向的参数,可以在登录之后直接重定向到原本用户想要去的页面,另外此方法不能验证ajax提交方式

public class LoginController : Controller
    {
        //
        // GET: /Login/
        public ActionResult Index(string oldController,string oldIndex)
        {
            ViewBag.controller = oldController;
            ViewBag.index = oldIndex;
            return View();
        }
    }

代码下载地址:https://pan.baidu.com/s/19ddvnTJlA8I_BvtB8OHFHg
本来我的想法是在Global.asax处写一个判断是否登录的,结果不行,Global是整个应用程序的入口,而Session是用户会话,另外附上我之前的做法吧

在Default控制器中写了个Action拦截器

public class LoginFilterAttribute : ActionFilterAttribute
    {
        private JXGLEntities db = new JXGLEntities();
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            string ActionName = filterContext.ActionDescriptor.ActionName;
            var session = System.Web.HttpContext.Current.Session["user"];
            if (session == null)
            {

                if (ActionName == "Index")
                {
                    filterContext.Result = new RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary(new { action = "Login" }));
                }
                else
                {
                    filterContext.Result = new RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary(new { action = "Login", warning = "1" })
                    );
                }
            }
            else
            {
                var page = (from c in db.T_PAGE where c.ADDRESS == ActionName select c).FirstOrDefault();
                if (page != null)
                {
                    var user = session as T_USER;
                    string role = user.POWER.ToString();
                    string msg = PageData.IsChecked(page.ID, role);
                    if (msg != "checked =\"checked\"")
                    {
                        filterContext.Result = new RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary(new { action = "PageReturn" }));
                    }
                }
            }
        }
    }

这样做麻烦的就是每个页面都要在ActionResult上加[LoginFilterAttribute],不过相比于重写OnActionExecuted方法还是有好处的,更灵活嘛。还可以验证ajax提交方式(没试过,应该可以,有兴趣可以试试)