1. 程式人生 > >MVC學習筆記:MVC實現用戶登錄驗證ActionFilterAttribute用法並實現統一授權

MVC學習筆記:MVC實現用戶登錄驗證ActionFilterAttribute用法並實現統一授權

重置 ids filter .config detail close login out gif

  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

MVC學習筆記:MVC實現用戶登錄驗證ActionFilterAttribute用法並實現統一授權