使用Response.Filter過濾非法詞彙

一般信息發佈網站,論壇等均具有實現非法詞彙過濾功能,即當用戶錄入非法詞彙時,進行替換,使其無法顯示到頁面上,針對此種功能,通常採用的時,在讀取時,在讀到非法詞彙後,進行替換。這樣做的好處是不用將非法詞彙存入數據庫,缺點是要在每次讀取時都要進行替換。另一種解決方案是在輸出時過濾掉非常詞彙,優點是隻要寫一次就好了,可以過濾整站的非法詞彙,缺點是,非法詞彙仍然存入到了數據庫中,呵呵,大家可以有針對性的選擇,本例用的是後者,起因在於當初沒有做此功能,後來需要添加,這時又不想改原來代碼,所以就想了這個辦法,主要是採用了HttpResponse.Filter屬性來處理。具體代碼如下:

首先自定義一個類,來作爲非法詞彙的過濾器

using System;
using System.Text;
using System.IO;
public class ResponseFilter : Stream
{
    #region properties

    Stream responseStream;
    long position;
    StringBuilder html = new StringBuilder();

    #endregion

    #region constructor

    public ResponseFilter(Stream inputStream)
    {
        responseStream = inputStream;
    }

    #endregion

    #region implemented abstract members

    public override bool CanRead
    {
        get { return true; }
    }

    public override bool CanSeek
    {
        get { return true; }
    }

    public override bool CanWrite
    {
        get { return true; }
    }

    public override void Close()
    {
        responseStream.Close();
    }

    public override void Flush()
    {
        responseStream.Flush();
    }

    public override long Length
    {
        get { return 0; }
    }

    public override long Position
    {
        get { return position; }
        set { position = value; }
    }

    public override long Seek(long offset, System.IO.SeekOrigin direction)
    {
        return responseStream.Seek(offset, direction);
    }

    public override void SetLength(long length)
    {
        responseStream.SetLength(length);
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        return responseStream.Read(buffer, offset, count);
    }

    #endregion

    #region write method

    public override void Write(byte[] buffer, int offset, int count)
    {
        string sBuffer = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);

        //得到非法詞彙列表,這個可以在數據庫或Web.Config中讀取出來
        string pattern = @"(非法詞彙1|非法詞彙2|非法詞彙3)";
        string[] s = pattern.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);

        foreach (string s1 in s)
        {
            sBuffer = sBuffer.Replace(s1, "**");
        }

        byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(sBuffer);
        responseStream.Write(data, 0, data.Length);
    }

    #endregion
}


然後再Global.asax文件中,添加如下代碼:

//這個適合多個頁一次過處理
public void Application_BeginRequest() 
{
    string path = HttpContext.Current.Request.Path.ToLower();
    string[] paths = new string[]
    {
        "/aa/","/bb/"
    };
    foreach (string item in paths)
    {
        if (path.StartsWith(item))
        {
            Response.Filter = new ResponseFilter(Response.Filter);
            break;
        }
    }
}


或者重寫某頁的Render方法

protected override void Render(HtmlTextWriter writer)
{
    StringWriter strWriter = new StringWriter();
    base.Render(new HtmlTextWriter(strWriter));
    string html = strWriter.ToString();
    html = Util.ReplaceInvalidKeyword(html);
    writer.Write(html);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章