From:一条被猫抛弃的他乡流浪狗!

mvc通过ActionFilterAttribute做登录检查

1.0 创建Attribute

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace LSUnion.Site.WebHelper
{
    [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple=false)]
    public class CheckAdminLoginAttribute:Attribute
    {
    }
}

 

2.0 创建 CheckAdminLoginActionFilterAttribute

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LSUnion.Site.Common;

namespace LSUnion.Site.WebHelper
{
    public class CheckAdminLoginActionFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            Type checkAdminAtt = typeof(CheckAdminLoginAttribute);
            //判断action或者action所在的controller是否贴有此标签
            var isCheckAdminLogin = filterContext.ActionDescriptor.IsDefined(checkAdminAtt, false) || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(checkAdminAtt, false);
            if (isCheckAdminLogin)//如果贴有标签,检查登录
            {
                //先判断session
                if (HttpContext.Current.Session[Keys.adminUserInfo] == null)
                {
                    //session为空,再判断cookie是否做了免登陆
                    var ck = filterContext.HttpContext.Request.Cookies[Keys.isRememberAdmin];//里面可以存加密的用户Id
                    if (ck!=null)
                    {
                        HttpContext.Current.Session[Keys.adminUserInfo] = ck.Value;
                    }
                    else
                    {
                        ToLogin(filterContext);
                    }

                }
            }


        }

        private void ToLogin(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                var jsonRes = new JsonResult();
                jsonRes.Data = new {status = (int) Enums.EAjaxStatus.nologin, msg = "您未登录或者登录已失效!"};
                filterContext.Result = jsonRes;
            }
            else
            {
                ActionResult res = new RedirectResult("/Admin/Login/index");
                filterContext.Result = res;
            }
        }
    }
}

 

3.0 在 App_Start里面的FilterConfig.cs中配置

using System.Web;
using System.Web.Mvc;
using LSUnion.Site.WebHelper;

namespace LSUnion.Site
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            filters.Add(new CheckAdminLoginActionFilterAttribute());//增加自己定义的过滤器
        }
    }
}

 

4.0 给需要做登录检查的方法或者控制器加上 [CheckAdminLogin]

posted @ 2016-01-28 16:13  ICE_Inspire  阅读(721)  评论(0编辑  收藏  举报