文档章节

替换禁用语(指定关键字)的过滤器

J
 Java编程思想
发布于 2014/08/04 09:18
字数 634
阅读 163
收藏 3

功能描述

        将请求响应中所有的禁用关键字替换掉之后再输出。

使用方法

        在 java web 项目的 web.xml 文件中添加如下代码。

 <!--替换关键字的过滤器配置  开始 -->
  <filter>
  <filter-name>StopWordsFilter</filter-name>
  <filter-class>com.hmw.filter.StopWordsFilter</filter-class>
  <init-param>
      <description>需要禁用的关键字,一个关键字占一行</description>
      <param-name>keys</param-name>
      <param-value>
        QQ
        百度
        七一五
      </param-value>
  </init-param>
  </filter>
  
  <filter-mapping>
  <filter-name>StopWordsFilter</filter-name>
  	<servlet-name>*.jsp</servlet-name>
  </filter-mapping>
 <!--替换关键字的过滤器  结束 -->

过滤器源码

ReplaceKeyWordFilter.java

package com.hmw.filter;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.StringTokenizer;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

/**
 * 替换关键字的滤器 

 * 
 * @author 
 */
public class StopWordsFilter implements Filter {
    private Set keyWords = new HashSet();

    /**
     * 将需要进行替换的关键字添加到一个定义好的 Set 中
     */
    @Override
    public void init(FilterConfig config) throws ServletException {
        String keys =  config.getInitParameter("keys");
        StringTokenizer tokenizer = new StringTokenizer(keys);
        String token = null;
        while (tokenizer.hasMoreTokens()) {
            token = tokenizer.nextToken();
            if(token != null && token.length() > 0){
                keyWords.add(tokenizer.nextToken());
            }
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws ServletException, IOException {
        CharArrayWrapper responseWrapper = new CharArrayWrapper(
                (HttpServletResponse) response);
        // 调用请求资源(使用自己包装的 responseWrapper)
        chain.doFilter(request, responseWrapper);
        // 取得响应字符串
        String responseString = responseWrapper.toString();
        // 将需要替换的关键字用“**”替换掉
        Iterator iter = keyWords.iterator();
        while (iter.hasNext()) {
            responseString = replace(responseString, iter.next(), "**");
        }
        
        // 修改响应头信息中的 Content-Length
        response.setContentLength(responseString.length());
        PrintWriter out = response.getWriter();
        out.write(responseString);
    }

    @Override
    public void destroy() {
    }

    /**
     * 将字符串中的所有的指定子字符串替换掉
     * @param mainString 需要进行替换的字符串
     * @param orig 需要被替换的子串
     * @param replacement 替换后的新串
     * @return 返回替换后的字符串
     */
    public static String replace(String mainString, String orig, String replacement) {
        String result = "";
        int oldIndex = 0;
        int index = 0;
        int origLength = orig.length();
        while ((index = mainString.indexOf(orig, oldIndex)) != -1) {
            result = result + mainString.substring(oldIndex, index) + replacement;
            oldIndex = index + origLength;
        }
        result = result + mainString.substring(oldIndex);
        return result;
    }
}

CharArrayWrapper.java

package com.hmw.filter;

import java.io.CharArrayWriter;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

/**
 * A response wrapper that takes everything the client would normally output and
 * saves it in one big character array.
 */
public class CharArrayWrapper extends HttpServletResponseWrapper {
	private CharArrayWriter charWriter;

	/**
	 * Initializes wrapper.
	 * <P>
	 * First, this constructor calls the parent constructor. That call is
	 * crucial so that the response is stored and thus setHeader, *setStatus,
	 * addCookie, and so forth work normally.
	 * <P>
	 * Second, this constructor creates a CharArrayWriter that will be used to
	 * accumulate the response.
	 */
	public CharArrayWrapper(HttpServletResponse response) {
		super(response);
		charWriter = new CharArrayWriter();
	}

	/**
	 * When servlets or JSP pages ask for the Writer, don't give them the real
	 * one. Instead, give them a version that writes into the character array.
	 * The filter needs to send the contents of the array to the client (perhaps
	 * after modifying it).
	 */
	@Override
	public PrintWriter getWriter() {
		return new PrintWriter(charWriter);
	}

	/**
	 * Get a String representation of the entire buffer.
	 * <P>
	 * Be sure <B>not</B> to call this method multiple times on the same
	 * wrapper. The API for CharArrayWriter does not guarantee that it
	 * "remembers" the previous value, so the call is likely to make a new
	 * String every time.
	 */
	@Override
	public String toString() {
		return charWriter.toString();
	}

	/** Get the underlying character array. */
	public char[] toCharArray() {
		return charWriter.toCharArray();
	}
}


本文转载自:http://www.cnblogs.com/hemingwang0902/archive/2012/01/13/stop-words-filter.html

J
粉丝 27
博文 166
码字总数 10234
作品 0
广州
程序员
私信 提问
替换禁用语(指定关键字)的过滤器(StopWordsFilter)

功能描述 将请求响应中所有的禁用关键字替换掉之后再输出。 使用方法 在 java web 项目的 web.xml 文件中添加如下代码。 过滤器源码 ReplaceKeyWordFilter.java CharArrayWrapper.java...

ForingY
2016/05/20
10
0
Logstash参考[6.1] »过滤器插件 » Csv过滤器插件-中文文档

Csv过滤器插件 插件版本:v3.0.7 发布于:2017-11-07 更新日志 获得帮助 有关插件的问题,请在讨论论坛中打开一个主题。对于错误或功能请求,请在Github中打开一个问题。有关弹性支持插件的列...

诺岚
2018/02/03
1
0
如何在指定的动作中加载 Yii-bootstrap 扩展

我在使用 Yii-Bootstrap extension 时遇到了个大问题,由于预加载机制使所有的 AJAX 请求都会初始化 bootstrap。这是资源的极大浪费,尤其是使用基于 AJAX 的文件上传工具拆分大文件上传时,...

首席烤地瓜
2012/12/17
0
0
ES学习记录10.3——ES分析器4(字符过滤器)

字符过滤器(Character filters)用于在将字符流传递给标记生成器Tokenizer之前对其进行预处理,它负责将最原始的文本作为字符流进行接受,可以对通过添加、移除或改变字符的方式改变流。比如一...

浮躁的码农
03/05
0
0
【更新】Kendo UI Professional Q1 2016 Beta全新发布

Kendo UI Professional 提供开源和商业两个版本。开源版 Kendo UI Core,有40+个框架和组件;商业版整合了之前的Kendo UI Web、Kendo UI Mobile 和 Kendo UI DataViz ,一共有70+个框架和组件...

Miss_Hello_World
2016/01/20
100
0

没有更多内容

加载失败,请刷新页面

加载更多

CenOS7安装Docker--yum安装

每次安装都要去看官方文档,比较烦。所以把官网的搬过来。官网链接:https://docs.docker.com/install/linux/docker-ce/centos/ #卸载已有的Dockersudo yum remove docker \ ...

RippleChan
12分钟前
3
0
SpringBoot2.0高级案例(07) 整合:Redis集群 ,实现消息队列场景

本文源码GitHub地址:知了一笑https://github.com/cicadasmile/middle-ware-parent 一、Redis集群简介 1、RedisCluster概念 Redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了...

知了一笑
28分钟前
0
0
服务器常见问题和故障诊断排除

原创: AIX7 talkwithtrend x86 服务器常见问题和故障诊断排除 | 周末送资料 : https://mp.weixin.qq.com/s/Qe_KConoUS6UzIANxAKacw 注意 : x86是我们广为熟知的架构,在核心处理器基础上,...

寰宇01
34分钟前
0
0
Android Camera模块解析之拍照

最近学习Android的camera模块,本文先介绍一下camera2的api,然后给出android camera拍照的例子,讲解一下camera 拍照的原因知识,与大家共勉。 camera2 介绍 android camera拍照功能介绍 一...

天王盖地虎626
42分钟前
7
0
Excel 曝Power Query安全漏洞

近日,Mimecast 威胁中心的安全研究人员,发现了微软 Excel 电子表格应用程序的一个新漏洞,获致 1.2 亿用户易受网络攻击。其指出,该安全漏洞意味着攻击者可以利用 Excel 的 Power Query 查...

linuxCool
48分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部