过滤器 -- Filter

devtools/2024/9/23 4:39:19/
  1. ActionFilterAttribute:
    示例:实现一个日志记录过滤器,记录每个控制器动作方法的执行时间和参数信息。

    public class LogActionFilterAttribute : ActionFilterAttribute
    {public override void OnActionExecuting(ActionExecutingContext context){// 记录方法开始执行时间和参数信息context.HttpContext.Items["StartTime"] = DateTime.Now;LogParameters(context.ActionArguments);}public override void OnActionExecuted(ActionExecutedContext context){// 记录方法执行结束时间和耗时var startTime = (DateTime)context.HttpContext.Items["StartTime"];var duration = DateTime.Now - startTime;LogDuration(duration);}private void LogParameters(IDictionary<string, object> parameters){// 将参数信息记录到日志中foreach (var param in parameters){// 记录参数名称和值}}private void LogDuration(TimeSpan duration){// 将方法执行时间记录到日志中// 例如: "Method executed in {duration.TotalMilliseconds} ms."}
    }
    
  2. AuthorizeAttribute:
    示例:实现一个基于角色的授权过滤器,只允许具有特定角色的用户访问某个控制器动作方法。

    public class RoleAuthorizeAttribute : AuthorizeAttribute
    {private readonly string[] _allowedRoles;public RoleAuthorizeAttribute(params string[] allowedRoles){_allowedRoles = allowedRoles;}protected override bool AuthorizeCore(HttpContextBase httpContext){// 获取当前用户的角色信息var user = httpContext.User;if (user.Identity.IsAuthenticated){// 检查用户是否具有允许的角色return _allowedRoles.Any(role => user.IsInRole(role));}return false;}
    }
    
  3. ExceptionFilterAttribute:
    示例:实现一个全局异常处理过滤器,将所有未处理的异常记录到日志中,并返回友好的错误页面。

    public class GlobalExceptionFilter : ExceptionFilterAttribute
    {public override void OnException(ExceptionContext context){// 记录异常信息到日志中LogException(context.Exception);// 设置响应状态码为500 Internal Server Errorcontext.HttpContext.Response.StatusCode = 500;// 设置视图名称为"Error"context.Result = new ViewResult { ViewName = "Error" };// 将异常信息传递给视图((ViewResult)context.Result).ViewData["Exception"] = context.Exception;// 标记异常已被处理context.ExceptionHandled = true;}private void LogException(Exception exception){// 将异常信息记录到日志中// 例如: logger.LogError(exception, "An unhandled exception occurred.");}
    }
    
  4. ResultFilterAttribute:
    示例:实现一个 JSON 格式化过滤器,将控制器动作方法的返回值自动序列化为 JSON 格式。

    public class JsonResultFilterAttribute : ResultFilterAttribute
    {public override void OnResultExecuting(ResultExecutingContext context){// 检查返回值是否为 JsonResult 类型if (context.Result is JsonResult jsonResult){// 将返回值序列化为 JSON 格式var json = JsonConvert.SerializeObject(jsonResult.Value);// 设置响应内容类型为 application/jsoncontext.HttpContext.Response.ContentType = "application/json";// 将 JSON 字符串写入响应context.HttpContext.Response.WriteAsync(json);// 标记结果已被处理context.Cancel = true;}}
    }
    

其他过滤器的使用示例可以参考官方文档或其他相关资料。总的来说,这些过滤器可以帮助开发者在 Web 应用程序中实现各种横切关注点,提高代码的可重用性和可维护性。


http://www.ppmy.cn/devtools/43024.html

相关文章

wordpress主题模板兔Modown 9.1开心版附送erphpdown v17.1插件

Modown 9.1开心版是一款模板兔开发的wordpress主题可&#xff0c;持续更新多年&#xff0c;优秀的资源下载类主题该模板基于Erphpdown&#xff0c;可以销售软件、视频教程、文章等等&#xff0c;通过主题和插件结合可以实现付费下载、付费阅读等功能&#xff0c;配合模板兔的一…

Django之Ajax实战笔记--城市级联操作

1. 项目架构搭建 1.1 创建项目tpdemo,创建应用myapp # 创建项目框架tpdemo$ django-admin startproject tpdemo$ cd tpdemo# 在项目中创建一个myapp应用$ python manage.py startapp myapp# 创建模板目录$ mkdir templates$ mkdir templates/myapp$ cd ..$ tree tpdemotpdemo…

5. C++网络编程-UDP协议的实现

UDP是无连接的。 UDP Server网络编程基本步骤 创建socket&#xff0c;指定使用UDP协议将socket与地址和端口绑定使用recv/send接收/发送数据 由于UDP是无连接的&#xff0c;直接侦听就行使用close关闭连接 这个UDP接收数据的时候用的API是recvfrom,发送数据是sendto 客户端 …

京东面试:SpringBoot同时可以处理多少请求?

面试题大全&#xff1a;www.javacn.site Spring Boot 作为 Java 开发中必备的框架&#xff0c;它为开发者提供了高效且易用的开发工具&#xff0c;所以和它相关的面试题自然也很重要&#xff0c;咱们今天就来看这道经典的面试题&#xff1a;Spring Boot 同时可以处理多少个请求…

【leetcode每日一题】——2903. 找出满足差值条件的下标 I——python

给你一个下标从 0 开始、长度为 n 的整数数组 nums &#xff0c;以及整数 indexDifference 和整数 valueDifference 。 你的任务是从范围 [0, n - 1] 内找出 2 个满足下述所有条件的下标 i 和 j &#xff1a; abs(i - j) > indexDifference 且abs(nums[i] - nums[j]) >…

React hooks - 自定义hooks

自定义hooks 自定义封装鼠标位置的 hook自定义封装秒数倒计时的 hook 在 src 目录下新建 hooks/index.ts 模块&#xff0c;自定义hooks都写在这里&#xff0c;自定义hooks都以use开头 自定义封装鼠标位置的 hook export const useMousePosition (delay:number 0) > {cons…

sqlites数据库读取,仅适用于数据少的数据库查询【改进版】

直接使用运行程序时加入数据库名和表明&#xff0c;直接完成查询 如&#xff1a;编译后的可执行程序为test&#xff0c;则在命令行输入 ./test test.db name 代码如下&#xff1a; #include <stdio.h> #include <sqlite3.h>static int callback(void *data, int …

基于PID的单片机温度控制系统设计

基于PID的温度控制系统设计 摘要 温度是工业上最基本的参数&#xff0c;与人们的生活紧密相关&#xff0c;实时测量温度在工业生产中越来越受到重视&#xff0c;离不开温度测量所带来的好处&#xff0c;因此研究控制和测量温度具有及其重要的意义。 本设计介绍了以AT89C52单片…