MVC 自定义过滤器(Filter)实现路由控制异常处理授权处理(获取客户端信息)

Posted 知毫厘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVC 自定义过滤器(Filter)实现路由控制异常处理授权处理(获取客户端信息)相关的知识,希望对你有一定的参考价值。

MVC 自定义过滤器(Filter)可以实现路由控制、异常处理、授权处理(获取客户端信息)

由于Controller 实现了 IActionFilter 、IAuthorizationFilter、IExceptionFilter 等几个过滤器接口,故可以自定义类实现这几个接口 然后在 FilterConfig.cs文件中 注册这几个过滤器  实现切面控制,具体代码如下:

FilterConfig.cs

//将自定义异常过滤器的优先级提高,防止异常被默认的HandleError处理(也可以自定义类重写HandleErrorAttribute 实现错误处理)

filters.Add(new SystemIExceptionFilter(), 1);

//控制器过滤器

filters.Add(new SystemIActionFilter(),  2);

//授权过滤器

filters.Add(new SystemIAuthorizationFilter(), 3);


路由访问过滤器

public class SystemIActionFilter : IActionFilter

    {

        //

        // Summary:

        //     Called after the action method is invoked.

        //      在Action返回之后

        // Parameters:

        //   filterContext:

        //     Information about the current request and action.

        public void OnActionExecuted(ActionExecutedContext filterContext)

        {

        }

        //

        // Summary:

        //     Called before the action method is invoked.

        //      在进入Action之前

        //      说明:使用RedirectToRouteResult进行路由值进行重定向时

        //      RouteName 路由名称 

        //      RouteValues 路由值  特别注意第三个值 Permanent 获取一个值

        //      该值指示重定向是否应为永久重定向 如果为true 在本程序会出现问题

        // Parameters:

        //   filterContext:

        //     Information about the current request and action.

        public void OnActionExecuting(ActionExecutingContext filterContext)

        {

            //验证 控制器 视图 

            string tempAction = filterContext.RouteData.Values["action"].ToString();

            string tempController = filterContext.RouteData.Values["controller"].ToString();

            string tempLoginAction = filterContext.RouteData.Values["action"].ToString();

 

            if (tempAction == "HomeLogin" && tempController == "Home" || tempLoginAction == "UserLogin" ? false : true)

            {

                //请求登录时

                if (tempAction == "UserLogin" && tempController == "Home" ? false : true)

                {

                    //Cookie

                    HttpCookie tempToken = filterContext.HttpContext.Request.Cookies["exclusiveuser_token"];

                    if (tempToken == null)

                    {

                        filterContext.Result = new RedirectToRouteResult("HomeLogin", new RouteValueDictionary(new { controller = "Home", action = "HomeLogin" }), false);

                    }

                    //登录token不为null时  进行合法性验证token 头部,载荷,签名,cookie过期时间

                    if (tempToken == null ? false : true)

                    {

                        //UserToken 方法 将验证 token 合法性 包括token 签名 ,token载荷,cookie 过期时间等

                        string SystemToken = new SecondTrackToken().UserToken();

                        if (SystemToken == null)

                        {

                            filterContext.Result = new RedirectToRouteResult("HomeLogin", new RouteValueDictionary(new { controller = "Home", action = "HomeLogin" }), false);

                        };

                    }

                }

            }

        }

    }


异常处理过滤器 

  public class SystemIExceptionFilter : IExceptionFilter

    {

         void IExceptionFilter.OnException(ExceptionContext filterContext)

        {

            Exception exception = filterContext.Exception;

            if (filterContext.ExceptionHandled)

            {

                return;

            }

            HttpException http = new HttpException(null, exception);

            /* 

             * filterContext.Exception.Message 错误信息

              */

            string messager = filterContext.Exception.Message;

 

            /* 

             * 错误日志

              */

            Log4NetHelp help = new Log4NetHelp();

            help.ErrorString(filterContext.Exception.Message);

            /* 

             * 设置自定义异常已经处理,避免其他过滤器异常覆盖

              */

            filterContext.ExceptionHandled = true;

 

            /* 

             * 在派生类重写时,设置或者重写一个值该值指定是否禁用ISS7.0中自定义错误

              */

            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;

        }

    }


授权处理(获取客户端信息)

 public class SystemIAuthorizationFilter : IAuthorizationFilter

    {

        void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext)

        {

            //当前操作计算机用户 

            string pcName = ((System.Web.HttpServerUtilityWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Server).MachineName;

            //视图

            string action = ((System.Web.Mvc.ReflectedActionDescriptor)filterContext.ActionDescriptor).ActionName;

            //控制器

            string controller = ((System.Web.Mvc.ReflectedActionDescriptor)filterContext.ActionDescriptor).ControllerDescriptor.ControllerName;

            //请求时间

            string time = filterContext.RequestContext.HttpContext.Timestamp.ToString();

            //请求相对路径

            string absturl = ((System.Web.UnvalidatedRequestValuesWrapper)((System.Web.HttpRequestWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Request).Unvalidated).Url.AbsoluteUri;

            //状态

            string code = ((System.Web.HttpResponseWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Response).Status;

            // 浏览器版本

            string browser = ((System.Web.HttpBrowserCapabilitiesWrapper)((System.Web.HttpRequestWrapper)((System.Web.HttpContextWrapper)filterContext.RequestContext.HttpContext).Request).Browser).Type;

            //请求方式

            string gepPost = ((System.Web.HttpRequestWrapper)((System.Web.Mvc.Controller)filterContext.Controller).Request).RequestType;

            //本地主机名称解析DNS本身处理。

            string server = ((System.Web.HttpRequestWrapper)((System.Web.HttpContextWrapper)filterContext.HttpContext).Request).UserHostAddress;

            #region  server 说明

            /*

              * 版权(c)1993 - 2009微软(msft . o:行情)。

              *

              * 这是一个示例所使用的主机文件微软为Windows TCP / IP。

              *

                          每一个

              * 条目应该保存在单个行。

              *被放置在第一列对应的主机名。

              *空间。

              *

              *此外,评论(这样的)可能是插入的个人

              *线或后机器名称用“*”符号。

              *

              例如:

              *

              * 102.54.94.97 rhino.acme.com源服务器

              * 38.25.63.10 x.acme.com x客户机主机

              *本地主机名称解析DNS本身处理。

              * 127.0.0.1 localhost

              *::1 localhost

              */

            #endregion

            //用户

            //部门

            //职位

 

        }

    }


--------------------- 

来源:CSDN 

原文:https://blog.csdn.net/zy0421911/article/details/54911712 

版权声明:本文为博主原创文章,转载请附上博文链接!


以上是关于MVC 自定义过滤器(Filter)实现路由控制异常处理授权处理(获取客户端信息)的主要内容,如果未能解决你的问题,请参考以下文章

AngularJs自定义过滤器filter

MVC之 自定义过滤器(ActionFilterAttribute)

ASP.NET MVC

MVC 剑道网格自定义过滤器

SpringCloud系列之网关gateway-9.自定义过滤器实现接口计时功能

YbSoftwareFactory 代码生成插件二十四:MVC中实现动态自定义路由