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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM