`
pcajax
  • 浏览: 2174349 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用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文件中,添加如下代码:

view plaincopy to clipboardprint?
<STRONG class=c>//这个适合多个页一次过处理  
</STRONG><STRONG class=k>public</STRONG> <STRONG class=k>void</STRONG> Application_BeginRequest()   
{  
    <STRONG class=k>string</STRONG> path = HttpContext.Current.Request.Path.ToLower();  
    <STRONG class=k>string</STRONG>[] paths = <STRONG class=k>new</STRONG> <STRONG class=k>string</STRONG>[]  
    {  
        <STRONG class=s>"/aa/"</STRONG>,<STRONG class=s>"/bb/"</STRONG>  
    };  
    <STRONG class=k>foreach</STRONG> (<STRONG class=k>string</STRONG> item <STRONG class=k>in</STRONG> paths)  
    {  
        <STRONG class=k>if</STRONG> (path.StartsWith(item))  
        {  
            Response.Filter = <STRONG class=k>new</STRONG> ResponseFilter(Response.Filter);  
            <STRONG class=k>break</STRONG>;  
        }  
    }  

//这个适合多个页一次过处理
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方法

view plaincopy to clipboardprint?
<STRONG class=k>protected</STRONG> <STRONG class=k>override</STRONG> <STRONG class=k>void</STRONG> Render(HtmlTextWriter writer)  
{  
    StringWriter strWriter = <STRONG class=k>new</STRONG> StringWriter();  
    <STRONG class=k>base</STRONG>.Render(<STRONG class=k>new</STRONG> HtmlTextWriter(strWriter));  
    <STRONG class=k>string</STRONG> html = strWriter.ToString();  
    html = Util.ReplaceInvalidKeyword(html);  
    writer.Write(html);  


 

分享到:
评论

相关推荐

    asp.net 使用Response.Filter 过滤非法词汇

    通过使用Response.Filter,开发者可以创建一个过滤器,该过滤器会拦截并检查响应的内容,以确保不包含任何未授权的词汇。 在本例中,通过自定义一个名为ResponseFilter的类,该类继承自Stream,并重写了相关的抽象...

    python使用response.read()接收json数据的实例

    以上这篇python使用response.read()接收json数据的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:Python简单读取json文件功能示例Python使用内置...

    jsp response.sendRedirect不跳转的原因分析及解决.docx

    如果没有登录,则使用 `response.sendRedirect()` 进行重定向,并通过 `return;` 终止后续代码的执行,以确保重定向能够成功完成。 #### 四、总结 通过以上分析可知,`response.sendRedirect()` 不跳转的问题主要...

    文件下载response.setHeader()下载中文文件名乱码问题解决办法.pdf

    文件下载时 response.setHeader() 下载中文文件名乱码问题可以通过使用 email 附件名编码方法对文件名进行编码来解决。同时,需要正确设置 Content-Type 和 Content-Disposition 头字段来确保文件下载正确。

    Jsp利用response.sendRedirect、cookie传参

    ### JSP中利用`response.sendRedirect`与...总之,在JSP开发中,熟练掌握`response.sendRedirect`和Cookie的使用,能够帮助开发者更灵活地控制页面流程,有效管理用户数据,从而构建更加健壮和高效的Web应用程序。

    response.getWriter().write()用于ajax

    服务器端的处理逻辑接收到AJAX请求后,会执行相关业务操作,然后使用`response.getWriter().write()`将结果编码为字符串并发送回客户端。 例如,在给定的`ChatController.java`中,可能包含一个处理聊天消息的AJAX...

    response.setHeader问题

    例如,使用 response.setHeader("Cache-Control", "no-cache") 可以禁用浏览器的缓存。 三、Pragma 报头 Pragma 报头是 HTTP 1.0 中用于指定缓存指令的报头域,用于替代 Cache-Control 报头。Pragma 报头可以设置...

    Response.AppendHeader使用大全

    ### Response.AppendHeader 使用大全 #### 一、概述 在 Web 开发中,`Response.AppendHeader` 方法被广泛用于向 HTTP 响应头添加自定义头部信息。这些头部信息可以用来控制浏览器的行为,如缓存策略、文件下载方式...

    ASP.NET Core自定义中间件如何读取Request.Body与Response.Body的内容详解

    本文将深入探讨如何在自定义中间件中读取`Request.Body`和`Response.Body`的内容。 首先,`Request.Body`代表HTTP请求的主体部分,通常用于发送POST数据或文件上传。它是`Stream`类型的,可以读取请求的数据。在ASP...

    金鹰asp超速入门视频教程-063.使用Response...总结.rar

    4. **结束响应**:`Response.End`方法可以立即结束当前页面的处理,阻止任何进一步的代码执行。这在某些情况下,如处理完特定任务后,防止额外代码运行是有用的: ```vbscript Response.Write "操作成功" ...

    Request和Response.txt

    在某些情况下,可能需要立即终止当前的响应流程,这时可以使用`Response.End`方法。一旦调用此方法,后续的任何输出都将被忽略。 ```vbnet Response.Write("Processing complete.") Response.End ``` ##### 3.3 URL...

    Response.Redirect与Server.Transfer的区别

    在ASP.NET开发中,页面跳转是常见的操作,主要涉及两种方法:Response.Redirect和Server.Transfer。它们虽然都能实现页面间的导航,但在工作原理、数据处理和用户体验上存在显著差异。 **Response.Redirect** ...

    前端项目-response.js.zip

    使用`response.js`插件的步骤大致如下: 1. 首先,你需要在HTML文档中引入jQuery、Ender或Zepto,以及response.js库。 2. 然后,定义你的断点,这通常是在CSS中完成,或者通过JavaScript设置。 3. 在需要响应式行为...

    ( response.setHeader()下载中文文件名乱码

    ( response.setHeader()下载中文文件名乱码问题

    C#中Response.Write常见问题汇总

    Response.Write 后连接Response.Redirect ,则Response.Write无法显示,直接跳转入Response.Redirect 的页面。 解决方式: Response.Write([removed]alert&#40;'成功修改'&#41;; [removed].href='index.aspx'...

    jsp response.sendRedirect()用法详解.docx

    jsp response.sendRedirect()用法详解 jsp response.sendRedirect()函数是JSP中一种常用的重定向方法,它可以将用户重定向到指定的页面。下面我们将详细介绍jsp response.sendRedirect()函数的用法和实现原理。 ...

    Response.Redirect 正在中止线程解决方案

    在ASP.NET开发中,我们经常会遇到“正在中止线程”(ThreadAbortException)的异常,这通常是由于在页面处理过程中使用了`Response.Redirect`或`Response.End`等方法所导致的。这些方法会中断当前线程的执行,引发异常...

    response.getWriter().write()向前台打印信息乱码问题解决

    使用response.getWriter().write() 乱码问题 解决方式: response.setContentType(text/html;charset=UTF-8); response.getWriter().write(在此处传递要显示的内容!); 您可能感兴趣的文章:对python中的iter()函数...

Global site tag (gtag.js) - Google Analytics