首页 / 网页编程 / ASP.NET / 一个较完整的关键字过滤解决方案(中)
一个较完整的关键字过滤解决方案(中)2011-04-17 博客园 Jeffrey Zhao问题远没结束上面的问题解决了没有?哦哦,我是指采取命名约定的方式来改变过滤行为。当然有问题 ,不过我这里提一下比较重要的两个:首先,就是“改名”这种行为——究竟是否方便?还记得我们的需求吗(提示一下:方便 、通用……)?如果采取上面的命名约定方案,我们可能就需要在页面的前端和后端都不断 地改名,一会儿加-noffw,一会儿加-json。如果项目只由您来负责这还好办,只是麻烦一些 ,但是如果您的团队中的前台开发人员性格古怪,固执己见,不愿配合怎么办(打架我喜欢 ,可惜不能直接解决问题)?再者,假如您除了一个FilterForbiddenWordModule之外还有类 似的“FilterScriptInjectionModule”怎么办(别真写这么一个HttpModule,不合适,老赵 只是想不出一个恰当的例子了)?如果两个Module都采取命名约定的方式,那么如何制定一 个两者能同时认同的约定就也是个麻烦事。再者,命名真是我们可以控制的吗?某些情况下好说,但是假如您在使用WebForms中的控 件怎么办?WebForm中的一个重要特性就是用过Naming Container来避免客户端ID的冲突。假 设我们的页面是放在一个Master Page中ID为Main的ContentPlaceHolder中,那么ID为 txtPassword的文本框在客户端里生成的HTML便会如下所示——那么我们又能有什么办法可以 做到“命名约定”吗?<input name="ctl00$Main$txtPassword" id="ctl00_Main_txtPassword"></input>嘿,看来这种命名约定的方式有时候真不是那么通用啊。那么我就来设法解决WebForm这 个问题。其实如果要解决WebForm这个问题,说白了就是要设法可以让服务器端明确指定一些字段 的处理方式。这种“特殊”则意味着对于过滤方式的判断必须与特定的Page——泛化一下, HttpHandler进行绑定。这里我先谈一下我的第一个想法:使用Custom Attribute进行标记的 方式。我们构造一个FilterForbiddenWordAttribute,其中包含一个抽象GetFilterType方法 根据key来指定过滤方式:public enum FilterForbiddenWordType
{
Ignored,
Normal,
Json,
Html
}
public abstract class FilterForbiddenWordAttribute : Attribute
{
public abstract FilterForbiddenWordType GetFilterType(string key);
}我们如果有特别的需求,就可以通过定义一个FilterForbiddenWordHandlerAttribute的 子类,重载GetFilterType方法,然后标记在HttpHandler上。如下:public class DefaultFilterForbiddenWordAttribute :
FilterForbiddenWordAttribute
{
public override FilterForbiddenWordType GetFilterType(string key)
{
if (key.EndsWith("txtPassword"))
{
return FilterForbiddenWordType.Ignored;
}
return FilterForbiddenWordType.Normal;
}
}
[DefaultFilterForbiddenWord]
public partial class Default : System.Web.UI.Page
{
...
}