通过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*)+"" ");    //&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方法找到相应的控件。
有不清楚的朋友给我留言。
posted @ 2008-04-07 14:06  王庆  阅读(3592)  评论(17编辑  收藏  举报