• 通过IHttpHandlerFactory,过滤TextBox、Input和Textarea中的特殊字符


    通过IHttpHandlerFactory过滤特殊字符,可以做到和具体项目无关,部署起来也挺简单。
    using System;
    using System.Web.UI;
    using System.Web;
    using System.Text.RegularExpressions;
    using System.Collections.Specialized;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    
    namespace JianCaiWeb.Utils
    {
        public class FilterStrFactoryHandler : IHttpHandlerFactory
        {
            public virtual IHttpHandler GetHandler(HttpContext context, string requestType, 
                string url, string pathTranslated)
            {
                //得到编译实例(通过反射)
                PageHandlerFactory factory = 
                    (PageHandlerFactory) Activator.CreateInstance(typeof(PageHandlerFactory), true);
                IHttpHandler handler = factory.GetHandler(context, requestType, url, pathTranslated);
                //过滤字符串
                if (requestType == "POST")
                {
                    Page page = handler as Page;
                    if (page != null)
                        page.PreLoad += new EventHandler(FilterStrFactoryHandler_PreLoad);
                }
    
                //返回
                return handler;
            }
            //过滤TextBox、Input和Textarea中的特殊字符
            void FilterStrFactoryHandler_PreLoad(object sender, EventArgs e)
            {
                try
                {
                    Page page = sender as Page;
                    NameValueCollection postData = page.Request.Form;
                    foreach (string postKey in postData)
                    {
                        Control ctl = page.FindControl(postKey);
                        if (ctl as TextBox != null)
                        {
                            ((TextBox) ctl).Text = Common.InputText(((TextBox) ctl).Text);
                            continue;
                        }
                        if (ctl as HtmlInputControl != null)
                        {
                            ((HtmlInputControl) ctl).Value = Common.InputText(((HtmlInputControl) ctl).Value);
                            continue;
                        }
                        if (ctl as HtmlTextArea != null)
                        {
                            ((HtmlTextArea) ctl).Value = Common.InputText(((HtmlTextArea) ctl).Value);
                            continue;
                        }
                    }
                }
                catch
                {
                }
            }
    
            public virtual void ReleaseHandler(IHttpHandler handler)
            {
            }
        }
    }

    Common.InputText的代码为:
    using System.Text.RegularExpressions;
    public class Common
    {
        //字符串过滤
        public static string InputText(string text)
        {
            text = text.Trim();
            if (string.IsNullOrEmpty(text))
                return string.Empty;
            text = Regex.Replace(text, "[\\s]{2,}", " ");    //two or more spaces
            text = Regex.Replace(text, "(<[b|B][r|R]/*>)+|(<[p|P](.|\\n)*?>)", "\n");    //<br>
            text = Regex.Replace(text, "(\\s*&[n|N][b|B][s|S][p|P];\\s*)+", " ");    //&nbsp;
            text = Regex.Replace(text, "<(.|\\n)*?>", string.Empty);    //any other tags
            text = text.Replace("'", "''");
            return text;
        }
    }

    项目中的web.config文件加上这句话:
    <httpHandlers>
        <!--过滤提交给服务器的文本信息-->
        <add verb="*" path="*.aspx" 
             validate="false" type="JianCaiWeb.Utils.FilterStrFactoryHandler, JianCaiWeb.Utils"/>
    </httpHandlers>

    代码其实挺好理解,就是在提交数据的时候(requestType=="POST"),通过PageHandlerFactory找到页面实例,将过滤字符串的方法(FilterStrFactoryHandler_PreLoad)加到Page实例的PreLoad事件上,使用这个方法有一个前提,就是Input和Textarea控件必须作为服务器控件运行,如果不这样做的话,就不能通过页面实例的FindControl方法找到相应的控件。

    作者:水木    
     
  • 相关阅读:
    Python-理解装饰器
    PHP-四种解析XML文件的方法
    学习-短信的上行(MO)和下行(MT)详解
    Linux-进程、进程组、作业、会话、控制终端详解
    Linux-进程基础
    Linux-查看进程的完整路径
    Linux-使用 screen 管理你的远程会话
    Python-常用字符串转换实例
    Python-闭包详解
    Git-Git Book阅读笔记
  • 原文地址:https://www.cnblogs.com/hsapphire/p/1568671.html
Copyright © 2020-2023  润新知