فیلتر کلمات به صورت داینامیک (Word Filtering)
پیش نیاز این مقاله :
1- مبانی و اصول شی گرایی قسمت
2- کار با بانک های اطلاعاتی
شاید تا به حال به این فکر افتاده باشید که برای سایت خود یک مدیریت فیلتر خودکار بسازید ، با این کار شما قادر خواهید بود کلمات مورد نظرتان را در سایت سانسور کنید .
خوشبختانه در Asp.NET این کار توسط خاصیت Filter کلاس HttpResponse انجام می شود .
نحوه کار به این صورت هست که ابتدا یک کلاس جدید ایجاد کرده که از کلاس System.IO.Stream ارث بری کند سپس متد Write این کلاس را Ovveride می کنیم :
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Microsoft.VisualBasic;
public class WordFilter : System.IO.Stream
{
private System.IO.Stream Base;
public WordFilter(System.IO.Stream ResponseStream)
{
if ((ResponseStream == null))
{
throw new ArgumentNullException("ResponseStream");
}
this.Base = ResponseStream;
}
public override bool CanRead
{
get
{
return true;
}
}
public override bool CanSeek
{
get
{
return true;
}
}
public override bool CanWrite
{
get
{
return true;
}
}
public override long Length
{
get
{
return 0;
}
}
public override long Position
{
get
{
return 0;
}
set
{
}
}
public override void Flush()
{
}
public override int Read(byte[] buffer, int offset, int count)
{
return this.Base.Read(buffer, offset, count);
}
public override long Seek(long offset, System.IO.SeekOrigin origin)
{
return 0;
}
public override void SetLength(long value)
{
}
public override void Write(byte[] buffer, int offset, int count)
{
// Get HTML code
string HTML = System.Text.Encoding.UTF8.GetString(buffer, offset, count);
// Replace the text with something else
HTML = HTML.Replace("بد", "***");
// Send output
buffer = System.Text.Encoding.UTF8.GetBytes(HTML);
this.Base.Write(buffer, 0, buffer.Length);
}
}
همانطور که ملاحظه می کنید در هنگام Override کردن متد Write پس از ایجاد و پر کردن متغیر HTML با کمک متد Replace کلمه مورد نظر را جایگزین کردم .
در اینجا فقط یک کلمه جایگزین شد اما شما می توانید لیستی از کلمات تهیه کرده و داخل جدول یک بانک اطلاعاتی ذخیره کنید و پس از خواندن اطلاعات داخل جدول عمل Replace را انجام دهید
public override void Write(byte[] buffer, int offset, int count)
{
// Get HTML code
string HTML = System.Text.Encoding.UTF8.GetString(buffer, offset, count);
// Replace the text with something else
using (SqlConnection Con = new SqlConnection(ConfigurationManager.ConnectionStrings["Con"].ConnectionString))
{
using (SqlCommand Cmd = new SqlCommand("select Word from TBLFilter", Con))
{
Con.Close();
SqlDataReader Dr = Cmd.ExecuteReader();
while (Dr.Read)
{
HTML = HTML.Replace(Dr["Word"].ToString(), "***");
}
Dr.Close();
Con.Close();
}
}
// Send output
buffer = System.Text.Encoding.UTF8.GetBytes(HTML);
this.Base.Write(buffer, 0, buffer.Length);
}
تقریبا کار تمام است کافیست خاصیت Filter کلاس HttpResponse را مقدار دهی کنید ، این عمل را هم میتوانید در رویداد Page_Load صفحه MasterPage و هم در رویداد Application_BeginRequest فایل Global.asax انجام دهید :
protected void Application_BeginRequest(object sender, EventArgs e)
{
Response.Filter = new WordFilter(Response.Filter);
}
فایل ضمیممه پروژه را از اینجا دانلود کنید .