• 设计模式-责任链模式


    定义

    责任链,顾名思义,就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕

    案例

    客户端输入校验,需要多个校验步骤,比如sql注入校验、违禁词校验、js校验

    客户端调用

    var dbHandler = new DBCheckHandler();
    dbHandler.SetNextHandler(new FHQCheckHandler()).SetNextHandler(new JSCheckHandler());
    dbHandler.Handle("alert");//输出js校验未通过
    

    责任链

        public abstract class CheckHandler
        {
            protected CheckHandler NextHandler = null;
    
            public CheckHandler SetNextHandler(CheckHandler nextHandler)
            {
                this.NextHandler = nextHandler;
                return nextHandler;
            }
            public abstract bool Handle(string content);
        }
        /// <summary>
        /// 数据库校验,防止sql注入
        /// </summary>
        public class DBCheckHandler : CheckHandler
        {
            string[] strs = new string[] { "SELECT", "UPDATE", "DELETE", "DROP", "WHERE", "FROM" };
            public override bool Handle(string content)
            {
                foreach (var str in strs)
                {
                    if (content.Contains(str))
                    {
                        Console.WriteLine("提交内容中不允许包含数据库违禁词");
                        return false;
                    }
                }
                if (this.NextHandler != null)
                {
                    return this.NextHandler.Handle(content);
                }
                return true;
            }
        }
        /// <summary>
        /// 违禁词校验
        /// </summary>
        public class FHQCheckHandler : CheckHandler
        {
            string[] strs = new string[] { "wei尼", "bao子", "皇帝", "大大" };
            public override bool Handle(string content)
            {
                foreach (var str in strs)
                {
                    if (content.Contains(str))
                    {
                        Console.WriteLine("违禁词校验未通过");
                        return false;
                    }
                }
                if (this.NextHandler != null)
                {
                    return this.NextHandler.Handle(content);
                }
                return true;
            }
        }
        /// <summary>
        /// js校验
        /// </summary>
        public class JSCheckHandler : CheckHandler
        {
            string[] strs = new string[] { "<script>", "alert", "location.", "window.open" };
            public override bool Handle(string content)
            {
                foreach (var str in strs)
                {
                    if (content.Contains(str))
                    {
                        Console.WriteLine("js校验未通过");
                        return false;
                    }
                }
                if (this.NextHandler != null)
                {
                    return this.NextHandler.Handle(content);
                }
                return true;
            }
        }
    
  • 相关阅读:
    选择排序--简单(c语言)
    冒泡排序--简单(c++)
    冒泡排序--简单(c语言)
    直接插入排序--简单(c++)
    Microsoft Azure File 服务简介
    【 D3.js 选择集与数据详解 — 1 】 使用datum()绑定数据
    物联网操作系统HelloX V1.77(beta)版本发布
    对XX证券报关于物联网操作系统的几个问题的答复
    使用 Azure Site Recovery 将内部部署虚拟化工作负荷迁移至 Azure
    使用 Azure Site Recovery 灾难恢复至 Azure 的功能现已正式发布
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/13281813.html
Copyright © 2020-2023  润新知