MVC学习笔记:MVC实现用户登录验证ActionFilterAttribute用法并实现统一授权

  1. 在项目下新建一个文件夹来专门放过滤器类,首先创建一个类LoginFilter,这个类继承ActionFilterAttribute。用来检查用户是否登录和用户权限。:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace weixinmenu.Filter
{
    /// <summary>
    /// 这个过滤器类继承ActionFilterAttribute
    /// </summary>
    public class LoginFilterAttribute:ActionFilterAttribute
    {
        /// <summary>
        /// 改写onactionexecuting(在controller action执行之前调用),去判断请求中是不是存了session。使用场景:如何验证登录等。
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (HttpContext.Current.Session["UserName"] == null)
            {
                HttpContext.Current.Response.Write("<script>alert('请先登录');window.parent.location.href='/Users/Login'</script>");
            }//这种是通过返回一段js代码来实现跳转登录页面
            //if (filterContext.HttpContext.Session["UserName"] == null)
            //{
            //    filterContext.HttpContext.Response.Redirect("/Users/Login");
            //}//这种就是直接通过过滤器上下文的的http上下文请求来进行重置链接
        }

        /// <summary>
        /// 在Action方法调用后,result方法调用前执行,使用场景:异常处理。
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
          //  base.OnActionExecuted(filterContext);
        }

        /// <summary>
        /// 在result执行前发生(在view 呈现前),使用场景:设置客户端缓存,服务器端压缩.
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            //base.OnResultExecuting(filterContext);
        }
        /// <summary>
        /// 在result执行后发生,使用场景:异常处理,页面尾部输出调试信息。
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
          //  base.OnResultExecuted(filterContext);
        }
    }
}

2.页面程序,也就是控制器里的程序,如下

LoginFilter是扩展属性,自定义属性名称是根据上面的LoginFilterAttribute名变化而来

当程序走controller/action时,会先走这个自定义特性LoginFilter再走action的。

[Filter.LoginFilter]
    public class WxMenuController : Controller
    {
        // GET: WxMenu

        WeixinMenuBusiness weixinMenuBusiness = new WeixinMenuBusiness();
        public ActionResult Index()
        {
            NHibernateHelper nhlper = new NHibernateHelper();
            ISession session = nhlper.GetSession();
            IEnumerable<WeiXinMenu> kinds = session.Query<WeiXinMenu>();
             WeiXinMenu root = kinds.FirstOrDefault(c => c.ParentId == "-1");
            ViewBag.root = kinds;
            return View(root);
        }
        
        public ActionResult Menu()
        {
            System.Web.HttpContext curContext = System.Web.HttpContext.Current;
            if (curContext.Session["UserName"] != null)
            {
                ViewBag.UserName = curContext.Session["UserName"].ToString();
            }
            
            return View();
            
        }
        /// <summary>
        /// 返回查询到的菜单json
        /// </summary>
        /// <param name="page"></param>
        /// <param name="rows"></param>
        /// <param name="sort"></param>
        /// <param name="order"></param>
        /// <returns></returns>
        public ActionResult MenuGridView(int? page, int? rows, string sort = "", string order = "asc")
        {
            return Content(GetMenuGridTree());
        }

        public string GetMenuGridTree()
        {
            NHibernateHelper nhlper = new NHibernateHelper();
            ISession session = nhlper.GetSession();
            List<TreeModel> result = new List<TreeModel>();
            List<TreeModel> children = new List<TreeModel>();
            IEnumerable<WeiXinMenu> kinds = session.Query<WeiXinMenu>();
            WeiXinMenu root = kinds.FirstOrDefault(c => c.ParentId == "-1");
            GetMenuGridTree(kinds, children, "10000");
            result.Add(new TreeModel
            {
                Id = root.Id.ToString(),
                MenuId = root.MenuId,
                Text = root.MenuName,
                Url = root.MenuUrl,
                ParentMenuId = root.ParentId.ToString(),
                IsEnable = root.IsEnable,
                OrderBy = root.OrderBy.ToString(),
                Target = root.MenuType,
                Ico = root.MenuKey,
                children = children
            });
            return JsonConvert.SerializeObject(result);
        }

        private void GetMenuGridTree(IEnumerable<WeiXinMenu> kinds, List<TreeModel> children, string pId)
        {
            foreach (WeiXinMenu p in kinds.Where(c => c.ParentId == pId).OrderBy(c => c.OrderBy))
            {
                TreeModel gt = new TreeModel();
                gt.Id = p.Id.ToString();
                gt.MenuId = p.MenuId;
                gt.Text = p.MenuName;
                gt.Url = p.MenuUrl;
                gt.ParentMenuId = p.ParentId;
                gt.IsEnable = p.IsEnable;
                gt.OrderBy = p.OrderBy.ToString();
                gt.Target = p.MenuType;
                gt.Ico = p.MenuKey;

                List<TreeModel> childrenTmp = new List<TreeModel>();

                GetMenuGridTree(kinds, childrenTmp, p.MenuId);

                /*
                if (childrenTmp.Count > 0)
                {
                    gt.state = "closed";
                }
                */

                gt.children = childrenTmp;

                children.Add(gt);
            }
        }

        public JsonResult MenuToWeiXin()
        {
            try
            {
                MenuManager.CreateMenu();
                return Json(new { Success = true, Message = "请求成功" });
            }
            catch (Exception ex)
            {
                return Json(new { Success = false,Message = ex.Message });
            }
        }
        /// <summary>
        /// 保存更新操作
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public JsonResult MenuSaveOrUpdate(WeiXinMenu model)
        {
            try
            {
                NHibernateHelper nhlper = new NHibernateHelper();
                ISession session = nhlper.GetSession();
                session.SaveOrUpdate(model);
                session.Flush();
                return Json(new { Success = true,Message = "保存成功"});
            }
            catch (Exception ex)
            {
                return Json(new { Success=false,Message = ex.Message});
            }
        }
        /// <summary>
        /// 菜单删除函数
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        public JsonResult MenuDelete(string ids)
        {
            try
            {
                NHibernateHelper nhlper = new NHibernateHelper();
                ISession session = nhlper.GetSession();
                string[] idss= ids.Split('\'');
                string idsss = idss[1];
                int id = int.Parse(idsss);
                WeiXinMenu tmpentites = session.Get<WeiXinMenu>(id);
                session.Delete(tmpentites);
                session.Flush();
                return Json(new { Success = true,Message = "删除成功"});
            }
            catch (Exception ex)
            {
                return Json(new { Success=false,Message = ex.Message});
            }
        }

        /// <summary>
        /// 菜单编辑函数
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ActionResult MenuEdit(int id)
        {
            NHibernateHelper nhlper = new NHibernateHelper();
            ISession session = nhlper.GetSession();
            WeiXinMenu model = session.Get<WeiXinMenu>(id);

            if (model == null)
            {
                model = new WeiXinMenu();
                model.IsEnable = "1";
                model.CreateTime = DateTime.Now;
            }

            return View(model);
        }

        public ActionResult MenuTree()
        {
            string ids = Request["ids"];
            List<string> data = new List<string>();
            if (ids.IsNotNull())
            {
                data = ids.ToStrList(',');
            }
             return Content(GetMenuComboTree(data));
          
        }
        public static string GetMenuComboTree(List<string> data)
        {
            NHibernateHelper nhlper = new NHibernateHelper();
            ISession session = nhlper.GetSession();
            List<ComboTree> result = new List<ComboTree>();
            List<ComboTree> children = new List<ComboTree>();
            IEnumerable<WeiXinMenu> kinds = session.Query<WeiXinMenu>();
            WeiXinMenu root = kinds.FirstOrDefault(c => c.ParentId == "-1");
            GetMenuComboTree(kinds, children, root.MenuId, data);
            result.Add(new ComboTree
            {
                id = root.MenuId.ToString(),
                text = root.MenuName,
                @checked = false,
                children = children
            });

            return JsonConvert.SerializeObject(result);
        }

        public static void GetMenuComboTree(IEnumerable<WeiXinMenu> kinds,
            List<ComboTree> children, string pId, List<string> data)
        {
            foreach (WeiXinMenu p in kinds.Where(c => c.ParentId == pId).OrderBy(c => c.OrderBy))
            {
                ComboTree gt = new ComboTree();
                gt.id = p.MenuId;
                gt.text = p.MenuName;

                List<ComboTree> childrenTmp = new List<ComboTree>();
                GetMenuComboTree(kinds, childrenTmp, p.MenuId, data);
                gt.children = childrenTmp;
                if (childrenTmp.Count == 0 && data.Contains(p.Id.ToString()))
                {
                    gt.@checked = true;
                }
                else
                {
                    gt.@checked = false;
                }
                children.Add(gt);
            }
        }

    }
View Code

 

3.在登录时存Session的操作:

在验证用户输入的用户名和密码都是正确之后。把用户名存到Session中去。 Session["UserName"] = UserName;

 ps:

在每次重新生成项目在时候,session 会过期,在 web.config 修改一下 session 配置,把session改成存在单线程里面即可解决。

web.config:

<system.web>  
  <sessionState mode="StateServer" timeout="30"></sessionState>  
</system.web>  

 

推荐一个比较好的讲相关内容的博客:http://blog.csdn.net/u010096526/article/details/46700581

一个MVC系列的博客:http://www.cnblogs.com/P_Chou/archive/2010/11/01/details-asp-net-mvc-content.html

posted @ 2017-06-29 15:33  jackche  阅读(4674)  评论(0编辑  收藏  举报