MVC 记录操作日志与过滤特殊字符

最近进行的MVC系统需要用到记录操作日志和过滤特殊字符的功能,如果每个action中都调用记录日志的方法就太麻烦了,所以根据需要结合mvc的过滤机制

写了个特殊字符验证与记录操作日志的公用类:

  1  public class CustomFilterAttribute : ActionFilterAttribute
  2     {
  3         public CustomFilterAttribute()
  4         {
  5             IsLog = false;
  6             FilterSpecialChar = true;
  7         }
  8
  9         /// <summary>
 10         /// 是否记录日志
 11         /// </summary>
 12         public bool IsLog { get; set; }
 13
 14         /// <summary>
 15         /// 是否过滤特殊字符
 16         /// </summary>
 17         public bool FilterSpecialChar { get; set; }
 18
 19         /// <summary>
 20         /// 登录用户
 21         /// </summary>
 22         public string UserName { get; set; }
 23
 24         /// <summary>
 25         /// 操作简介
 26         /// </summary>
 27         public string Message { get; set; }
 28
 29         /// <summary>
 30         /// action执行前特殊字符过滤
 31         /// </summary>
 32         /// <param name="filterContext"></param>
 33         public override void OnActionExecuting(ActionExecutingContext filterContext)
 34         {
 35             base.OnActionExecuting(filterContext);
 36
 37             if (filterContext.ActionParameters.Count > 0)
 38             {
 39                 if (filterContext.HttpContext.Request.IsAjaxRequest())
 40                 {
 41                     if (IsContainSpecialChar(filterContext.ActionParameters))
 42                     {
 43                         var json = new JsonResult();
 44                         json.Data = new { status = false, msg = "您输入的数据中包含特殊字符。" };
 45                         json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
 46                         filterContext.Result = json;
 47                     }
 48                 }
 49                 else if (IsContainSpecialChar(filterContext.ActionParameters))
 50                 {
 51                     var ReturnUrl = "/Login/Index";
 52                     filterContext.Result = new RedirectResult(ReturnUrl);
 53                 }
 54             }
 55
 56             return;
 57         }
 58
 59         /// <summary>
 60         /// action执行后记录日志
 61         /// </summary>
 62         /// <param name="filterContext"></param>
 63         public override void OnActionExecuted(ActionExecutedContext filterContext)
 64         {
 65             base.OnActionExecuted(filterContext);
 66             if (this.IsLog)
 67             {
 68                 var ActionName = filterContext.ActionDescriptor.ActionName;
 69                 var Url = "/" + filterContext.ActionDescriptor.ControllerDescriptor.ControllerName + "/" + ActionName;
 70
 71                 //var loginInfo = (ViewModel.t_User_VModel)filterContext.HttpContext.Session["userMdl"];
 72                 string OperateIP = HttpContext.Current.Request.UserHostAddress;
 73
 74                 //登录用户
 75                 //if (loginInfo != null)
 76                 //{
 77                 //    this.UserName = loginInfo.UserName;
 78                 //}
 79                 this.UserName = "测试";
 80                 Message = filterContext.Exception == null ? "成功" : "失败" + Message;
 81
 82                 new JiaSoftOTOSystem.BLL.OperateLog_BLL().AddOprateLog(UserName, OperateIP, Url, ActionName, Message);
 83             }
 84         }
 85
 86         //public override void OnResultExecuting(ResultExecutingContext filterContext)
 87         //{
 88         //    base.OnResultExecuting(filterContext);
 89         //    //filterContext.HttpContext.Response.Write("返回Result之前" + Message + "<br />");
 90         //}
 91
 92         //public override void OnResultExecuted(ResultExecutedContext filterContext)
 93         //{
 94         //    base.OnResultExecuted(filterContext);
 95         //    //filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />");
 96         //}
 97
 98         /// <summary>
 99         /// 验证string类型参数中是否含有特殊字符
100         /// </summary>
101         /// <param name="paramters"></param>
102         /// <returns>有:true,没有:false</returns>
103         public bool IsContainSpecialChar(IDictionary<string, object> paramters)
104         {
105             bool bResult = false;
106             System.Text.StringBuilder strParam = new System.Text.StringBuilder();
107             foreach (var item in paramters)
108             {
109                 if (item.Value != null)
110                 {
111                     Type types = item.Value.GetType();
112                     if (types.Name.EndsWith("Model"))
113                     {
114                         System.Reflection.PropertyInfo[] ps = types.GetProperties();
115                         foreach (PropertyInfo pi in ps)
116                         {
117                             object value = pi.GetValue(item.Value, null);//用pi.GetValue获得值
118                             string name = pi.Name;//获得属性的名字,后面就可以根据名字判断来进行些自己想要的操作
119                             //获得属性的类型,进行判断然后进行以后的操作,例如判断获得的属性是整数
120                             if (value != null && value.ToString().Length > 0)
121                             {
122                                 if (value.GetType() == typeof(string))
123                                 {
124                                     if (FilterSpecialChar && !bResult && Regex.IsMatch(value.ToString(), @"[~<>$%\^\+\&\\\/\?\|:\{}()‘;=]"))
125                                     {
126                                         bResult = true;
127                                         strParam.Append(name + "=" + value.ToString().Replace("‘", "‘").Replace("\"", "").Replace("&", "&amp").Replace("<", "&lt").Replace(">", "&gt") + "|");
128                                     }
129                                     else if (IsLog)
130                                     {
131                                         strParam.Append(name + "=" + value + "|");
132                                     }
133                                 }
134                                 else if (IsLog && item.Value.GetType() == typeof(Guid) && item.Value.ToString() != Guid.Empty.ToString())
135                                 {
136                                     strParam.Append(name + "=" + value + "|");
137                                 }
138                                 else if (IsLog && (item.Value.GetType() == typeof(int) || item.Value.GetType() == typeof(decimal)) && item.Value.ToString() != "0")
139                                 {
140                                     strParam.Append(name + "=" + value + "|");
141                                 }
142                                 else if (IsLog)
143                                 {
144                                     strParam.Append(name + "=" + value + "|");
145                                 }
146                             }
147                         }
148                     }
149                     else if (item.Value != null && item.Value.ToString().Length > 0)
150                     {
151                         if (item.Value.GetType() == typeof(string))
152                         {
153                             if (FilterSpecialChar && !bResult && Regex.IsMatch(item.Value.ToString(), @"[~<>$%\^\+\&\\\/\?\|:\{}()‘;=]"))
154                             {
155                                 bResult = true;
156                                 strParam.Append(item.Key + "=" + item.Value.ToString().Replace("‘", "‘").Replace("\"", "").Replace("&", "&amp").Replace("<", "&lt").Replace(">", "&gt") + "|");
157                             }
158                             else if (IsLog)
159                             {
160                                 strParam.Append(item.Key + "=" + item.Value + "|");
161                             }
162                         }
163                         else if (IsLog && item.Value.GetType() == typeof(Guid) && item.Value.ToString() != Guid.Empty.ToString())
164                         {
165                             strParam.Append(item.Key + "=" + item.Value + "|");
166                         }
167                         else if (IsLog && (item.Value.GetType() == typeof(int) || item.Value.GetType() == typeof(decimal)) && item.Value.ToString() != "0")
168                         {
169                             strParam.Append(item.Key + "=" + item.Value + "|");
170                         }
171                         else if (IsLog)
172                         {
173                             strParam.Append(item.Key + "=" + item.Value + "|");
174                         }
175                     }
176                 }
177             }
178
179             this.Message = "。参数:" + strParam.ToString();
180
181             return false;
182         }
183
184     }

调用方式如下:

验证结果:如果包含特殊字符:如果是ajax请求则返回json,否则返回到错误页。

时间: 2024-10-13 01:47:58

MVC 记录操作日志与过滤特殊字符的相关文章

ThreadLocal 在记录操作日志中的应用

ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多.可能很多朋友都知道ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量 在HandlerInterceptor的preHandle 中可以截取crud等操作的一些url public class PlatformLogInterceptor implements HandlerInterceptor { private Logger log = LoggerF

Tomcat会话超时时怎样记录操作日志,满足安全审计要求

众所周知.在实际的Web应用程序中,会话管理一般都採用Web容器会话管理功能. 使用Tomcat做Webserver也是如此,并且从安全的角度考虑,尽量避免去更改和干预Web容器的会话管理功能. Tomcat会话管理功能肯定比我们自己做出来要全面和可靠,况且Tomcat是主流开源社区维护的.有专门的团队来开发和维护.一旦爆出安全漏洞,也能非常快被修复. 在实际开发中,为了满足安全审计的要求.Web应用程序一旦有会话注销.就应该记录操作日志.注销一般分为操作者主动注销.应用程序检測到异常攻击主动注

Tomcat会话超时时如何记录操作日志,满足安全审计要求

众所周知,在实际的Web应用程序中,会话管理一般都采用Web容器会话管理功能. 使用Tomcat做Web服务器也是如此,而且从安全的角度考虑,尽量避免去更改和干预Web容器的会话管理功能. Tomcat会话管理功能肯定比我们自己做出来要全面和可靠,况且Tomcat是主流开源社区维护的,有专门的团队来开发和维护,一旦爆出安全漏洞,也能很快被修复. 在实际开发中,为了满足安全审计的要求,Web应用程序一旦有会话注销,就应该记录操作日志,注销一般分为操作者主动注销.应用程序检测到异常攻击主动注销会话.

Spring boot学习(六)Spring boot实现AOP记录操作日志

前言 在实际的项目中,特别是管理系统中,对于那些重要的操作我们通常都会记录操作日志.比如对数据库的CRUD操作,我们都会对每一次重要的操作进行记录,通常的做法是向数据库指定的日志表中插入一条记录.这里就产生了一个问题,难道要我们每次在 CRUD的时候都手动的插入日志记录吗?这肯定是不合适的,这样的操作无疑是加大了开发量,而且不易维护,所以实际项目中总是利用AOP(Aspect Oriented Programming)即面向切面编程这一技术来记录系统中的操作日志. 日志分类 这里我把日志按照面向

Spring aop 记录操作日志 Aspect

前几天做系统日志记录的功能,一个操作调一次记录方法,每次还得去收集参数等等,太尼玛烦了.在程序员的世界里,当你的一个功能重复出现多次,就应该想想肯定有更简单的实现方法.于是果断搜索各种资料,终于搞定了,现在上代码 环境: SpringMvc + myBatis jar包 :      (aspect.jar也行,我原来项目中有,便没有替换了) 1.自定义注解类   ArchivesLog.java(获取Controller描述用的) package com.noahwm.uomp.archive

MVC增加操作日志

在后台管理中,有一些操作是需要增加操作日志的,尤其是对一些比较敏感的金额类的操作,比如商城类的修改商品金额.删除商品.赠送金额等人工的操作.日志中记录着相关操作人的操作信息,这样,出了问题也容易排查. 那么如何高效统一的处理增加这些日志呢?下面,分享一下我的思路及做法. 1.建日志相关表.需要建两个表,一是日志类型表(ActivityLogType),二是日志表(ActivityLog), 相关的表结构如下: 日志类型表:Id,SystemKeyword,Name,Enable (1 自动投标设

自定义日志注解 + AOP实现记录操作日志

需求:系统中经常需要记录员工的操作日志和用户的活动日志,简单的做法在每个需要的方法中进行日志保存操作, 但这样对业务代码入侵性太大,下面就结合AOP和自定义日志注解实现更方便的日志记录 首先看下一个简单的操作日志表 action_log id subject(日志主题) content(日志内容) create_by create_time 日志主题可以用下面的枚举类来实现 package cn.bounter.common.model; /** * 应用日志主题枚举类 * @author si

salt-api return mysql返回的使用,记录操作日志

说在前面 折腾这个搞了半天,现做下记录 安装依赖(操作只在master端) yum install mysql-python or pip install mysql-python master端本地数据库中创建对应的表结构 CREATE DATABASE `salt` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; USE `salt`; -- -- Table structure for table `jids` --

salt return mysql返回的使用,记录操作日志

1.安装依赖(操作只在master端) yum -y install MySQL-python 2.master端本地数据库中创建对应的表结构 CREATE DATABASE  `salt`   DEFAULT CHARACTER SET utf8   DEFAULT COLLATE utf8_general_ci; USE `salt`;    -- -- Table structure for table `jids` --    DROP TABLE IF EXISTS `jids`; C