快速业务通道

一个较完整的关键字过滤解决方案(中)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

问题远没结束

上面的问题解决了没有?哦哦,我是指采取命名约定的方式来改变过滤行为。当然有问题 ,不过我这里提一下比较重要的两个:

首先,就是“改名”这种行为——究竟是否方便?还记得我们的需求吗(提示一下:方便 、通用……)?如果采取上面的命名约定方案,我们可能就需要在页面的前端和后端都不断 地改名,一会儿加-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
{
   ...
}

当然,我们还需要对FilterForbiddenWordModule进行一些修改才能使之生效(朋友们可 以先不要看代码,想想这次改变的关键在哪里?):

public class FilterForbiddenWordModule : IHttpModule
{
   ...
   void IHttpModule.Init(HttpApplication context)
   {
     context.PostMapRequestHandler += new EventHandler (OnPostMapRequestHandler);
   }
   private static void OnPostMapRequestHandler(object sender, EventArgs e)
   {
     var context = (sender as HttpApplication).Context;
     v

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号