MVC攔截器,MVC過濾器,MVC ActionFilterAttribute攔截器過濾器,OnActionExecuting

來源:互聯網
上載者:User

標籤:mvc攔截器   mvc過濾器   mvc actionfilterattribute攔截器過濾器   

該過濾攔截器動態攔截字串和實體類檢查是否有關鍵字,對字串和動態實體類進行修改很再提交。

第一步:新的攔截器類名並繼承ActionFilterAttribute  :CustomerFilterAttribute:ActionFilterAttribute  


第二步:在方法OnActionExecuting中實現


第三步:在對應的Action或者類上方加上[CustomerFilter]即可實現對該Action或者類進行攔截控制過濾。

完整代碼如下:


using System;

using System.Collections.Generic;

using System.Linq;

using System.Reflection;

using System.Security.Policy;

using System.Text;

using System.Web;

using System.Web.Mvc;

using System.Reflection;



namespace SaaS.Admin.Base

{

    /// <summary>

    /// 全域過濾器

    /// </summary>

    public class CustomerFilterAttribute:ActionFilterAttribute  

    {

        /// <summary>

        /// 在執行操作Action方法前執行調用

        /// </summary>

        /// <param name="filterContext"></param>

        public override void OnActionExecuting(ActionExecutingContext filterContext)

        {

            base.OnActionExecuting(filterContext);

            var parameters = filterContext.ActionDescriptor.GetParameters();

            foreach (var parameter in parameters)

            {

                if (parameter.ParameterType == typeof(string))

                {

                    //擷取字串參數原值

                    var orginalValue = filterContext.ActionParameters[parameter.ParameterName] as string;

                    //使用過濾演算法處理字串

                    if (!string.IsNullOrEmpty(orginalValue) && orginalValue!="")

                    {

                        var filteredValue = HtmlEscapeCode(orginalValue);

                        ////將處理後值賦給參數

                        filterContext.ActionParameters[parameter.ParameterName] = filteredValue;

                    }


                }

                else if (parameter.ParameterName =="model")

                {

                    //擷取字串參數原值

                    var value = filterContext.ActionParameters[parameter.ParameterName];


                    if (value.GetType().IsClass && value.GetType().Name != "String")//檢查是否是類,並且不是字串類型

                    {


                        object objClass = value;//擷取字串參數原值

                        PropertyInfo[] infos = objClass.GetType().GetProperties();//擷取原對象的所有公用屬性


                        #region 動態建立新執行個體【動態建立新的實體類執行個體】

                        System.Type tt = System.Type.GetType(value.ToString());//擷取指定名稱的類型

                        object ff = Activator.CreateInstance(tt, null);//建立指定類型執行個體

                        PropertyInfo[] fields = ff.GetType().GetProperties();//擷取指定對象的所有公用屬性


                        object obj = Activator.CreateInstance(tt, null);//建立新指定類型的執行個體【動態建立新的執行個體】

                        #endregion


                        foreach (PropertyInfo info in infos)

                        {

                            if (info.CanRead)

                            {

                                //Console.WriteLine(info.Name + "=" + info.GetValue(objClass, null));


                                if (info.PropertyType.Name == "String") 

                                {

                                    //擷取值

                                    string orginalValue =Convert.ToString(info.GetValue(objClass, null));

                                    if (!string.IsNullOrEmpty(orginalValue) || orginalValue!="")

                                    {

                                        //檢查過濾特殊字元

                                        var filteredValue = HtmlEscapeCode(orginalValue);

                                        //將處理後值賦給參數

                                        info.SetValue(obj, filteredValue, null);

                                        //給實體物件賦新值

                                        filterContext.ActionParameters[parameter.ParameterName] = obj;

                                    }

                                }

                                else

                                {

                                    object orginalValue = info.GetValue(objClass, null);//擷取值

                                    info.SetValue(obj, orginalValue,null);//給對象賦新值

                                    filterContext.ActionParameters[parameter.ParameterName] = obj;//給實體類對象賦值

                                }

                            }

                        }


                    }

                }


            }


        }


        /// <summary>

        /// 在執行操作Action方法後執行調用

        /// </summary>

        /// <param name="filterContext"></param>

        public override void OnActionExecuted(ActionExecutedContext filterContext)

        {

            

            base.OnActionExecuted(filterContext);

            var controllerName = filterContext.RouteData.Values["controller"];

            var actionName = filterContext.RouteData.Values["action"];

        }


        //過濾關鍵字

        public string HtmlEscapeCode(string html)

        {

            var strhtml = html.Replace("javascript", "")

                        .Replace("vbscript", "")

                        .Replace("jscript", "")

                        .Replace("script", "")

                        .Replace("eval", "")

                        .Replace("<", "<")

                        .Replace(">", ">")

                        .Replace("\‘", "'")

                        .Replace("\"", """)

                        .Replace("&", "&")

                        .Replace("#", "#");

            return strhtml;

        }


    }

}


例如:如:對基類BaseController 進行控制


using System;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Web.Mvc;

using Microsoft.Practices.ServiceLocation;

using SaaS.Contracts.SaaS.Intern;

using SaaS.Framework.IIdentity;

using SaaS.Models.Domain.Enums;


namespace SaaS.Admin.Base

{

    /// <summary>

    /// 基礎Controller

    /// </summary>

    [CustomerFilter]

    public class BaseController : Controller

    {

        /// <summary>

        /// 彈出成功提示

        /// </summary>

        /// <param name="message">成功訊息</param>

        /// <param name="url">跳轉路徑</param>

        /// <returns></returns>

        protected ActionResult SuccessResult(string message, string url)

        {


            TempData["SuccessResult"] = message;

            return Redirect(url);

        }

    }

MVC攔截器,MVC過濾器,MVC ActionFilterAttribute攔截器過濾器,OnActionExecuting

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.