加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

聊一聊Asp.net过滤器Filter那一些事

发布时间:2020-06-17 02:08:38 所属栏目:编程 来源:站长网
导读:副标题#e# 最近在整理优化.net代码时,发现几个很不友好的处理现象:登录判断、权限认证、日志记录、异常处理等通用操作,在项目中的action中到处都是。在代码优化上,这一点是很重要着力点。这时.net中的过滤器、拦截器(Filter)就派上用场了。现在根据这

/// <summary> /// MVC自定义授权 /// 认证授权有两个重写方法 /// 具体的认证逻辑实现:AuthorizeCore 这个里面写具体的认证逻辑,认证成功返回true,反之返回false /// 认证失败处理逻辑:HandleUnauthorizedRequest 前一步返回 false时,就会执行到该方法中 /// 但是,我平时在应用过程中,一般都是在AuthorizeCore根据不同的认证结果,直接做认证后的逻辑处理 /// </summary> public class XYHMVCAuthorizeAttribute : AuthorizeAttribute { /// <summary> /// 认证逻辑 /// </summary> /// <param>过滤器上下文</param> public override void OnAuthorization(AuthorizationContext filterContext) { // 此处主要写认证授权的相关验证逻辑 // 该部分的验证一般包括两个部分 // 登录权限校验 // --我们的一般处理方式是,通过header中传递一个token来进行逻辑验证 // --当然不同的系统在设计上也不尽相同,有的也会采用session等方式来验证 // --所以最终还是根据其项目本身的实际情况来进行对应的逻辑操作 // 具体的页面权限校验 // --该部分的验证是具体的到页面权限验证 // --我看有得小伙伴没有做到这一个程度,直接将这一步放在前端js来验证,这样不是很安全,但是可以拦住小白用户 // --当然有的系统根本就没有做权限控制,那就更不需要这一个逻辑了。 // --所以最终还是根据其项目本身的实际情况来进行对应的逻辑操作 // 现在用一个粗暴的方式来简单模拟实现过,用系统当前时间段秒厨艺3,取余数 // 当余数为0:认证授权通过 // 1:代表为登录,调整至登录页面 // 2:代表无访问权限,调整至无权限提示页面 // 当然,在这也还可以做一些IP白名单,IP黑名单验证 请求频率验证等等 // 说到这而,还有一点需要注意,如果我们选择的是全局注册该过滤器,那么如果有的页面根本不需要权限认证,比如登录页面,那么我们可以给不需要权限的认证的控制器或者action添加一个特殊的注解 AllowAnonymous ,来排除 // 获取Request的几个关键信息 HttpRequest httpRequest = HttpContext.Current.Request; string acitonName = filterContext.ActionDescriptor.ActionName; string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; // 注意:如果认证不通过,需要设置filterContext.Result的值,否则还是会执行action中的逻辑 filterContext.Result = null; int thisSecond = System.DateTime.Now.Second; switch (thisSecond % 3) { case 0: // 认证授权通过 break; case 1: // 代表为登录,调整至登录页面 // 只有设置了Result才会终结操作 filterContext.Result = new RedirectResult("/html/Login.html"); break; case 2: // 代表无访问权限,调整至无权限提示页面 filterContext.Result = new RedirectResult("/html/NoAuth.html"); break; } } }

ActionFilter:自定义过滤器

自定义过滤器,主要是监控action请求前后,处理结果返回前后的事件。其中API只有请求前后的两个方法。

重新方法

 

方法功能描述

 

使用于

 

OnActionExecuting

 

一个请求在进入到aciton逻辑前执行

 

MVC、API

 

OnActionExecuted

 

一个请求aciton逻辑执行后执行

 

MVC、API

 

OnResultExecuting

 

对应的view视图渲染前执行

 

MVC

 

OnResultExecuted

 

对应的view视图渲染后执行

 

MVC

 

在这几个方法中,我们一般主要用来记录交互日志,记录每一个步骤的耗时情况,以便后续系统优化使用。具体的使用,根据自身的业务场景使用。

其中MVC和API的异同点,和上面说的认证授权的异同类似,不在详细说明。

下面的一个实例代码:

API定义过滤器实例DEMO代码

/// <summary> /// Action过滤器 /// </summary> public class XYHAPICustomActionFilterAttribute : ActionFilterAttribute { /// <summary> /// Action执行开始 /// </summary> /// <param></param> public override void OnActionExecuting(HttpActionContext actionContext) { } /// <summary> /// action执行以后 /// </summary> /// <param></param> public override void OnActionExecuted(HttpActionExecutedContext actionContext) { try { // 构建一个日志数据模型 MApiRequestLogs apiRequestLogsM = new MApiRequestLogs(); // API名称 apiRequestLogsM.API = actionContext.Request.RequestUri.AbsolutePath; // apiKey apiRequestLogsM.API_KEY = HttpContext.Current.Request.QueryString["ApiKey"]; // IP地址 apiRequestLogsM.IP = FilterAttributeHelp.GetIPAddress(actionContext.Request); // 获取token string token = HttpContext.Current.Request.Headers.GetValues("Token") == null ? string.Empty : HttpContext.Current.Request.Headers.GetValues("Token")[0]; apiRequestLogsM.TOKEN = token; // URL apiRequestLogsM.URL = actionContext.Request.RequestUri.AbsoluteUri; // 返回信息 var objectContent = actionContext.Response.Content as ObjectContent; var returnValue = objectContent.Value; apiRequestLogsM.RESPONSE_INFOR = returnValue.ToString(); // 由于数据库中最大只能存储4000字符串,所以对返回值做一个截取 if (!string.IsNullOrEmpty(apiRequestLogsM.RESPONSE_INFOR) && apiRequestLogsM.RESPONSE_INFOR.Length > 4000) { apiRequestLogsM.RESPONSE_INFOR = apiRequestLogsM.RESPONSE_INFOR.Substring(0, 2000); } // 请求参数 apiRequestLogsM.REQUEST_INFOR = actionContext.Request.RequestUri.Query; // 定义一个异步委托 ,异步记录日志 // Func<MApiRequestLogs, string> action = AddApiRequestLogs;//声明一个委托 // IAsyncResult ret = action.BeginInvoke(apiRequestLogsM, null, null); } catch (Exception ex) { } } }

HandleError:错误处理

异常处理对于我们来说很常用,很好的利用异常处理,可以很好的避免全篇的try/catch。异常处理箱单很简单,值需要自定义集成:ExceptionFilterAttribute,并自定义实现:OnException方法即可。

在OnException我们可以根据自身需要,做一些相应的逻辑处理,比如记录异常日志,便于后续问题分析跟进。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读