您的位置:首页 > 理论基础 > 计算机网络

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

2009-01-14 09:10 405 查看
通过IHttpHandlerFactory过滤特殊字符,可以做到和具体项目无关,部署起来也挺简单。

using[/b] System;
using[/b] System.Web.UI;
using[/b] System.Web;
using[/b] System.Text.RegularExpressions;
using[/b] System.Collections.Specialized;
using[/b] System.Web.UI.WebControls;
using[/b] System.Web.UI.HtmlControls;

namespace[/b] JianCaiWeb.Utils
{
public[/b] class[/b] FilterStrFactoryHandler : IHttpHandlerFactory
{
public[/b] virtual[/b] IHttpHandler GetHandler(HttpContext context, string[/b] requestType,
string[/b] url, string[/b] pathTranslated)
{
//得到编译实例(通过反射)
[/b]            PageHandlerFactory factory =
(PageHandlerFactory) Activator.CreateInstance(typeof[/b](PageHandlerFactory), true[/b]);
IHttpHandler handler = factory.GetHandler(context, requestType, url, pathTranslated);
//过滤字符串
[/b]            if[/b] (requestType == "POST"[/b])
{
Page page = handler as[/b] Page;
if[/b] (page != null[/b])
page.PreLoad += new[/b] EventHandler(FilterStrFactoryHandler_PreLoad);
}

//返回
[/b]            return[/b] handler;
}
//过滤TextBox、Input和Textarea中的特殊字符
[/b]        void[/b] FilterStrFactoryHandler_PreLoad(object[/b] sender, EventArgs e)
{
try[/b]
{
Page page = sender as[/b] Page;
NameValueCollection postData = page.Request.Form;
foreach[/b] (string[/b] postKey in[/b] postData)
{
Control ctl = page.FindControl(postKey);
if[/b] (ctl as[/b] TextBox != null[/b])
{
((TextBox) ctl).Text = Common.InputText(((TextBox) ctl).Text);
continue[/b];
}
if[/b] (ctl as[/b] HtmlInputControl != null[/b])
{
((HtmlInputControl) ctl).Value = Common.InputText(((HtmlInputControl) ctl).Value);
continue[/b];
}
if[/b] (ctl as[/b] HtmlTextArea != null[/b])
{
((HtmlTextArea) ctl).Value = Common.InputText(((HtmlTextArea) ctl).Value);
continue[/b];
}
}
}
catch[/b]
{
}
}

public[/b] virtual[/b] void[/b] ReleaseHandler(IHttpHandler handler)
{
}
}
}

Common.InputText的代码为:

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

项目中的web.config文件加上这句话:

<[/b]httpHandlers[/b]>[/b]
<!--过滤提交给服务器的文本信息-->[/b]
<[/b]add[/b] verb=[/b]"*"[/b] path=[/b]"*.aspx"[/b]
validate=[/b]"false"[/b] type=[/b]"JianCaiWeb.Utils.FilterStrFactoryHandler, JianCaiWeb.Utils"[/b]/>[/b]
</[/b]httpHandlers[/b]>[/b]

<httpHandlers>
<!--过滤提交给服务器的文本信息-->
<add verb="*" path="*.aspx"
validate="false" type="JianCaiWeb.Utils.FilterStrFactoryHandler, JianCaiWeb.Utils"/>
</httpHandlers>
代码其实挺好理解,就是在提交数据的时候(requestType=="POST"),通过PageHandlerFactory找到页面实例,将过滤字符串的方法(FilterStrFactoryHandler_PreLoad)加到Page实例的PreLoad事件上,使用这个方法有一个前提,就是Input和Textarea控件必须作为服务器控件运行,如果不这样做的话,就不能通过页面实例的FindControl方法找到相应的控件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: