阅读文章

通过IHttpHandlerFactory,过滤TextBox、Input和Textarea

[日期:2008-04-08] 来源:  作者: [字体: ]

     通过IHttpHandlerFactory,过滤TextBox、Input和Textarea中的特殊字符通过IHttpHandlerFactory过滤特殊字符,可以做到和具体项目无关,部署起来也挺简单。
  using System;
  using System.IO;
  using System.Web.UI;
  using System.Web;
  using System.Configuration;
  using System.Text.RegularExpressions;
  using System.Web.Compilation;
  using System.Reflection;
  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的代码为:
   //字符串过滤
   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*)+", " "); // 
   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方法找到相应的控件。
  有不清楚的朋友给我留言。
    


阅读:
录入:blue1000

评论 】 【 推荐 】 【 打印
上一篇:另一个多版本IE共存软件 IETester
下一篇:第三回:实现步骤显示,一步一步看得见
相关文章      
本文评论
发表评论


点评: 字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款