功能描述

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

使用方法

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

StopWordsFilter

com.hmw.filter.StopWordsFilter

需要禁用的关键字,一个关键字占一行

keys

QQ

百度

七一五

StopWordsFilter

*.jsp

过滤器源码

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.

*

* 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.

*

* 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.

*

* Be sure not 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();

}

}

java屏蔽关键字_替换禁用语(指定关键字)的过滤器相关推荐

  1. java将占位符替换成指定字符串的函数

    提供一个可以将占位符替换成指定字符串的函数 /*** 将message中的占位符按照从左到右的顺序替换成制定的字符串.* 如:info("你好,我是{},我{}岁了", " ...

  2. python with关键字_完全理解Python关键字with与上下文管理器

    如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 "with" 关键字的语句,它通常用在什么场景呢?今天就来说说 with 和 上下文管理器. 对于系统资源如文件.数据 ...

  3. mysql声明变量关键字_声明变量的关键字

    查询查看: 静态关键字static   同时在类中声明常量的关键字( 关键字final) 静态关键字static的作用 1,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内 ...

  4. java获取密钥长度_#1071 - 指定密钥太长;最大密钥长度为767字节

    回答(28) 2 years ago 767字节是MySQL版本5.6(及之前版本)中InnoDB表的stated prefix limitation . MyISAM表的长度为1,000字节 . 在 ...

  5. mysql 别名 关键字_我们可以使用MySQL关键字作为列的别名吗?

    是的,我们可以使用关键字作为列的别名.以下是语法-select yourColumnName AS `yourKeywordAsAliasName` from yourTableName; 在上方,y ...

  6. Java屏蔽输入法_输入框禁止输入法

    禁止输入法 形式: 参数说明形式: active 代表输入法为中文 inactive 代表输入法为英文 auto 代表打开输入法 (默认) disable 代表关闭输入法 具体例子如下: 禁止inpu ...

  7. java 屏蔽邮箱_使用javamail发送邮件的时候如何阻止附件内容输出到控制台

    我在使用JavaMail发送带附件的邮件时候,每次到了Transport.sendMessage()这一步,控制台就会输出附件内容,请问如何设置可以取消输出呢? public void sendFil ...

  8. Java屏蔽输入法_技巧:如何禁止输入法切换到全角状态

    如果你不愿意看解决过程,答案就是:注册热键.以下废话可以略过. 不知道大家有没有和我一样的烦恼.我在Delphi中编程的时候,由于需要使用Alt+Shift+Space来查看函数的声明,但是输入法的全 ...

  9. python异常处理结构的关键字_以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: (  )...

    [A型题]培养真菌常用的培养基是( ) [填空题]He made a quick ________________( adapt) to the new environment. [A型题]属于真核细 ...

最新文章

  1. 读Lodash源码——chunk.js
  2. 本地Windows远程桌面连接阿里云Ubuntu服务器
  3. 如何网络推广教大家怎样通过提高用户粘性来助力排名提升?
  4. shell编程之case语句及函数
  5. 来,和腾讯一起共建未来城市
  6. 电子工程系庆贺电贺信_创造下一代光电子集成电路
  7. pytorch_GPU安装
  8. vs安装msdn安装文档
  9. 塑胶产品内滑块设计要点,以及注意哪些事项?
  10. 详解Instant类
  11. 微信小程序模板消息测试- formId 的获取
  12. 视频变声用的什么软件?来看看今天的分享
  13. 2019年寒假集训-二分专题
  14. Qt之自定义属性Q_PROPERTY
  15. 集成svn到eclipse luna
  16. 美团面试题:Hashmap的结构,1.7和1.8有哪些区别,史上最深入的分析
  17. 10个有用的第三方iOS开源库
  18. 全国大学生信息安全竞赛-创新实践能力赛-SMU
  19. 【学习日记】接口安全
  20. 每个人心里都有个非盈利性质的理想

热门文章

  1. docker 多阶段构建
  2. java错误页面显示错误信息_Struts2在JSP页面中显示错误信息和提示信息的方法
  3. java web定义数组_Java基础之数组--数组常用操作
  4. linux 操作系统中的谷歌浏览器google chrome打不开怎么解决
  5. 海啸(二维前缀和/二维树状数组)
  6. N^N最左边和最右边的数(数学)
  7. 【直播预告 | 阿里云 CDP 公开课】11月25日下午14点准时开讲
  8. 揭秘阿里云 RTS SDK 如何实现直播降低延迟和卡顿
  9. 快手基于 Flink 的持续优化与实践
  10. RDS For MySQL常见连接问题总结