MVC一个简单实用的过滤类

提到过滤类,就要先介绍一下ActionFilterAttribute这个基类

ActionFilterAttribute:表示筛选器特性的基类。

这个类下面有四个虚方法:

在执行操作方法后由 ASP.NET MVC 框架调用。

public virtual void OnActionExecuted(ActionExecutedContext filterContext);
在执行操作方法之前由 ASP.NET MVC 框架调用。
public virtual void OnActionExecuting(ActionExecutingContext filterContext);
在执行操作结果后由 ASP.NET MVC 框架调用。
public virtual void OnResultExecuted(ResultExecutedContext filterContext);
在执行操作结果之前由 ASP.NET MVC 框架调用。
public virtual void OnResultExecuting(ResultExecutingContext filterContext);

在本文主要介绍一下OnActionExecuting这个方法:

代码如下:

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

namespace demo.App_Start
{
    /// <summary>
    /// 过滤类
    /// </summary>
    //[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
    public class FilterController:ActionFilterAttribute
    {
        //filterContextInfo fcinfo;

        /// <summary>
        ///  OnActionExecuting 在执行操作方法之前由 ASP.NET MVC 框架调用。
        ///  此处进行session过滤
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            
            try
            {
                HttpCookie cookie = filterContext.HttpContext.Request.Cookies["user"];

                #region 这里也可以进行权限操作
                //bool islogin = false;
                //if (cookie != null)
                //{
                //    islogin = true;
                //}
                //fcinfo = new filterContextInfo(filterContext);
         //string domainName = fcinfo.domainName;//获取域名
                //string controllerName = fcinfo.controllerName;//获取 controllerName 名称
                //string actionName = fcinfo.actionName;//获取方法名
    
                //if (islogin)//有权限
                //{
                //    #region
                //    //跳转到访问的页面 
                //    //filterContext.Result = new HttpUnauthorizedResult("/UserLogin/index");
                //    //也可以跳到别的站点
                //    // filterContext.Result = new RedirectResult("http://www.baidu.com");
                //    //filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new { Controller = "product", action = "Default" }));
                //    #endregion
                //    return;
                //}
                //else
                //{
                //    //此处可记录访问受限的用户操作信息写入数据库

                //    filterContext.Result = new ContentResult { Content = @"抱歉,你不具有当前操作的权限!" };// 直接返回 return Content("抱歉,你不具有当前操作的权限!")
                //}
                #endregion

                if (cookie != null)
                {
                    if (filterContext.HttpContext.Session["useradmin"] == null)
                    {
                        string username = demo.helper.DESEncrypt.Decrypt(cookie.Value);

                        MySql.Data.MySqlClient.MySqlParameter[] sqlpar = {
                                                                     new MySql.Data.MySqlClient.MySqlParameter("@username",username)
                                                                     };
                        var ds = demo.UserMethod.User.GetList("username=@username", sqlpar);

                        var model = demo.UserMethod.User.DataTableToList(ds.Tables[0]);

                        if (model != null)
                        {
                            cookie.Expires = DateTime.Now.AddMinutes(15);
                            filterContext.HttpContext.Response.Cookies.Add(cookie);
                            filterContext.HttpContext.Session["useradmin"] = model;
                            return;
                        }
                    }
                    else
                    {
                        cookie.Expires = DateTime.Now.AddMinutes(15);
                        filterContext.HttpContext.Response.Cookies.Add(cookie);
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                //异常处理,可将异常写入数据库
            }
            if (filterContext.RequestContext.HttpContext.Request.HttpMethod.ToLower().Equals("get"))
            {
                filterContext.Result =
             new ContentResult() { Content = "{\"code\":10010,\"msg\":\"请求有误!\"}", ContentType = "application/json; charset=utf-8", ContentEncoding = Encoding.UTF8 };
                return;
            }
            //session过期.
            filterContext.HttpContext.Response.AddHeader("sessionstate", "timeout");
            filterContext.Result =
                new ContentResult() { Content = "{\"code\":10011,\"msg\":\"系统检查到用户操作超时,请重新登录!\"}", ContentType = "application/json; charset=utf-8", ContentEncoding = Encoding.UTF8 };

            //重定向
            //filterContext.HttpContext.Response.Redirect(@"/UserLogin/index");
        }

        #region 

        /// <summary>
        /// OnResultExecuting 在执行操作结果之前由 ASP.NET MVC 框架调用。
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            base.OnResultExecuting(filterContext);
        }

        /// <summary>
        /// OnActionExecuted 在执行操作方法后由 ASP.NET MVC 框架调用。
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
        }

        /// <summary>
        /// OnResultExecuted 在执行操作结果后由 ASP.NET MVC 框架调用。
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            base.OnResultExecuted(filterContext);
        }

        #endregion

        #region Class
        public class filterContextInfo
        {
            public filterContextInfo(ActionExecutingContext filterContext)
            {
                #region 获取链接中的字符
                // 获取域名
                domainName = filterContext.HttpContext.Request.Url.Authority;
                //获取模块名称
                module = filterContext.HttpContext.Request.Url.Segments[1].Replace('/', ' ').Trim();
                //获取 controllerName 名称
                controllerName = filterContext.RouteData.Values["controller"].ToString();
                //获取ACTION 名称
                actionName = filterContext.RouteData.Values["action"].ToString();
                #endregion
            }
            /// <summary>
            /// 获取域名
            /// </summary>
            public string domainName { get; set; }
            /// <summary>
            /// 获取模块名称
            /// </summary>
            public string module { get; set; }
            /// <summary>
            /// 获取 controllerName 名称
            /// </summary>
            public string controllerName { get; set; }
            /// <summary>
            /// 获取ACTION 名称
            /// </summary>
            public string actionName { get; set; }
        }
        #endregion
    }
}


调用方法:


里面session和cookie的操作都是在登录控制器里面进行赋值的,退出登录清掉session和cookie,过滤类里面进行判断


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值