`
pcajax
  • 浏览: 2159411 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

通过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方法找到相应的控件。
分享到:
评论

相关推荐

    asp.net mvc源码分析

    MapHttpHandler通过IHttpHandlerFactory创建实例,然后将其赋值给HttpContext的Handler属性。 接下来,处理管道中的CallHandlerExecutionStep将被添加,它负责调用IHttpHandler的BeginProcessRequest方法,开始异步...

    IIS处理页面运行机制

    通过ISAPI过滤器和ASP.NET Framework的配合,IIS能够有效地处理各种动态页面,为用户提供丰富的Web应用体验。理解这一机制有助于开发者更好地优化应用程序性能,提高系统的响应速度和服务质量。

    IIS处理页面的运行机制

    接着,根据配置文件(如`web.config`或`machine.config`)中的设置,IIS会识别出这是一个需要通过特定程序处理的动态页面,并将请求转发给对应的处理程序。 在这个过程中,`.aspx`文件被映射到了`aspnet_isapi.dll`...

    IHttpHandler介绍

    接下来,我们将通过三个具体示例来探讨`IHttpHandler`的实现方法和使用过程。 ##### 1. 图片防盗链 在实现图片防盗链的过程中,可以通过创建一个实现了`IHttpHandler`接口的类来检查请求来源是否合法。如果来源...

    HttpModule HttpHandler HttpHandlerFactory

    通过实现IHttpHandlerFactory接口,你可以自定义HttpHandler的创建和回收逻辑。这在某些场景下非常有用,比如当你需要根据不同的条件返回不同的HttpHandler实例,或者希望在不修改Web.config的情况下添加新的处理...

    Community Server专题.pdf

    在现代操作系统中,线程和进程是程序执行的基本单位。理解这两者之间的区别及其在Community Server (CS) 中的应用至关重要。 **线程与进程的概念:** - **进程**:是程序的一次动态执行过程,它是操作系统进行资源...

    ihttphandler_ihttpmodule

    通过自定义HandlerFactory,我们可以更灵活地管理和实例化IHttpHandler,而IHttpModule则让我们能对整个请求生命周期进行精细控制。"HandlerFactoryTest"这个示例项目提供了一个实践这些概念的起点,帮助我们更好地...

    ASP.NET页面请求处理介绍

    HttpContext对象在整个请求处理过程中扮演着关键角色,开发者通常通过它来访问和操作请求和响应数据。 接着,HttpRuntime对象利用HttpApplicationFactory来确定哪个HttpApplication实例将处理请求。...

    asp.net URL重写简化版 速学URL重写

    此外,如果URL包含查询字符串参数,我们需要将其保存并传递给`RewritePath`方法,以便它们在重定向后仍能被正确解析和使用。 这个简化版的教程虽然没有深入探讨URL重写的底层原理,但它提供了一个快速上手的实践...

    HttpHandler HttpModule入门篇

    生命周期中涉及到几个非常重要的对象:HttpHandler,HttpModule,IHttpHandlerFactory,他们的执行(顺序)大致的执行过程是这样的:client端发送页面请求,被IIS的某个进程截获,它根据申请的页 面后缀(.aspx)不同,...

Global site tag (gtag.js) - Google Analytics