好记性不如烂笔头31-java应用中的敏感词过滤实现(3)

敏感词过滤,国内混的同学看到这个都会会心一笑。其实敏感词过滤,在几乎所有国家都是存在的,只是表现的形式并不完全相同而已。

既然这个功能叫做关键词过滤,那么做在过滤器中,应该是一个好主意。

1、JAVA实现利用过滤器实现敏感信息过滤

过滤器的JAVA代码:

package com.filter;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

importjava.io.UnsupportedEncodingException;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

importjavax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

importjavax.servlet.http.HttpServletResponse;

/**

*一个简单的敏感词过滤器,这里针对从GET的方式做了转码,如果用POST方式,将ISO8859-1字符转换为UTF-8下面一段要注释掉

*@author 范芳铭

*/

public class EasyDirtyFilter implementsFilter{

private FilterConfig config = null;

@Override

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("----过滤器初始化----");

this.config = filterConfig;

}

//过滤器功能在这里实现

@Override

public void doFilter(ServletRequest req, ServletResponse resp,

FilterChain chain) throwsIOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;

HttpServletResponse response = (HttpServletResponse) resp;

String charset = "UTF-8";

request.setCharacterEncoding(charset);

response.setCharacterEncoding(charset);

response.setContentType("text/html;charset="+charset);

DirtyRequest dirtyreq = new DirtyRequest(request);

chain.doFilter(dirtyreq, response);

}

@Override

public void destroy() {

System.out.println("----过滤器销毁----");

}

private List<String> getDirtyWords(){

List<String> dirtyWords = new ArrayList<String>();

String dirtyWordPath = config.getInitParameter("dirtyword");

InputStream inputStream =config.getServletContext().getResourceAsStream(dirtyWordPath);

InputStreamReader is = null;

try {

is = newInputStreamReader(inputStream,"UTF-8");

} catch (UnsupportedEncodingException e2) {

e2.printStackTrace();

}

BufferedReader reader = new BufferedReader(is);

String line;

try {

while ((line =reader.readLine())!= null) {//如果 line为空说明读完了

dirtyWords.add(line);

}

} catch (IOException e) {

e.printStackTrace();

}

return dirtyWords;

}

//使用Decorator模式包装request对象,实现敏感字符过滤功能

class DirtyRequest extends HttpServletRequestWrapper{

private List<String> dirtyWords = getDirtyWords();

private HttpServletRequest request;

public DirtyRequest(HttpServletRequest request) {

super(request);

this.request = request;

}

//重写getParameter方法,实现对敏感字符的过滤

@Override

public String getParameter(String name) {

String value =this.request.getParameter(name);

//如果get的方式提交表单,通过request.setCharacterEncoding("UTF-8");这种方式是解决不了中文乱码问题

//参考:http://blog.csdn.net/ffm83/article/details/43229819

if(value==null){

return null;

}

//将ISO8859-1字符转换为UTF-8

try {

value=new String(value.getBytes("ISO8859-1"),"UTF-8") ;

}catch (UnsupportedEncodingException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

for(String dirtyWord : dirtyWords){

if(value.contains(dirtyWord)){

System.out.println("内容中包含敏感词:"+dirtyWord+",将会被替换成****");

//替换敏感字符

value =value.replace(dirtyWord, "****");

}

}

return value;

}

}

}

2、将过滤器添加到Web.xml

<!--配置过滤器 -->

<filter>

<filter-name>easyFilter</filter-name>

<filter-class>com.filter.EasyDirtyFilter2</filter-class>

<!-- 配置要过滤的敏感字符文件 -->

<init-param>

<param-name>dirtyword</param-name>

<param-value>/WEB-INF/dirtyword.txt</param-value>

</init-param>

</filter>

<!--映射过滤器 -->

<filter-mapping>

<filter-name>easyFilter</filter-name>

<!--“/*”表示拦截所有的请求-->

<url-pattern>/*</url-pattern>

</filter-mapping>

<servlet>

<servlet-name>dirty</servlet-name>

<servlet-class>com.servlet.RequestDirty</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>dirty</servlet-name>

<url-pattern>/dirty</url-pattern>

</servlet-mapping>

3、测试用的servlet源代码

package com.servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

/**

*从外部获取信息,如果有敏感词,那么需要过滤

*@author 范芳铭

*/

public class RequestDirty extendsHttpServlet {

publicvoid doGet(HttpServletRequest request, HttpServletResponse response)

throwsServletException, IOException {

Stringinfo = request.getParameter("info");

//在过滤器里进行了转码,这里就不要再进行转码

//info=new String(info.getBytes("ISO8859-1"),"UTF-8") ;

System.out.println(info);

PrintWriterout = response.getWriter();

out.write("获得信息如下:" + info);

}

publicvoid doPost(HttpServletRequest request, HttpServletResponse response)

throwsServletException, IOException {

doGet(request,response);

}

}

4、其他

一个关键词文件,dirtyword.txt 放在WEB-INF下。

关键词文件如下:(仅供示例,无任何含义)

粗话

黑人

黑鬼

5、测试

在浏览器输入:

http://127.0.0.1:8080/webStudy/dirty?info=黑人是美国无产阶级的成员

页面输出结果:获得信息如下:****是美国无产阶级的成员

后台输入情况:

内容中包含敏感词:黑人,将会被替换成****

****是美国无产阶级的成员

时间: 2024-12-31 02:07:40

好记性不如烂笔头31-java应用中的敏感词过滤实现(3)的相关文章

好记性不如烂笔头50-javaWeb框架struts2中的方法拦截器(5)

1. Struts2的方法拦截器概述 Struts2拦截器也可以通过MethodFilterInterceptor类实现,MethodFilterInterceptor重写了AbstractInterceptor类的intercept(ActionInvocationinvocation)方法,但提供了一个doIntercept(ActionInvocation invocation)抽象方法.从这种设计方式可以看出,MethodFilterInterceptor类的intercept已经实现了

好记性不如烂笔头49-javaWeb框架struts2中的拦截器(4)

1. Struts2的拦截器概述 Struts2拦截器是在访问某个Action或Action的某个方法之前拦截,或者在运行之后处理.Struts2拦截器是可插拔的,拦截器是AOP(Aspect Oriented Programming,面向切面编程)的一种实现 Struts2的拦截器栈(InterceptorStack)就是将拦截器按一定的顺序联结成一条链.在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用. Struts2规定用户自定义拦截器必须实现com

转:Java实现敏感词过滤

敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来一看,整个过程如下:读取敏感词库.如果HashSet集合中,获取页面上传文字,然后进行匹配.我就想这个过程肯定是非常慢的.对于他这个没有接触的人来说我想也只能想到这个,更高级点就是正则表达式.但是非常遗憾,这两种方法都是不可行的.当然,在我意识里没有我也没有认知到那个算法可以解决问题,但是Googl

Java实现敏感词过滤

敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来一看,整个过程如下:读取敏感词库.如果HashSet集合中,获取页面上传文字,然后进行匹配.我就想这个过程肯定是非常慢的.对于他这个没有接触的人来说我想也只能想到这个,更高级点就是正则表达式.但是非常遗憾,这两种方法都是不可行的.当然,在我意识里没有我也没有认知到那个算法可以解决问题,但是Googl

Java实现敏感词过滤(转)

敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来一看,整个过程如下:读取敏感词库.如果HashSet集合中,获取页面上传文字,然后进行匹配.我就想这个过程肯定是非常慢的.对于他这个没有接触的人来说我想也只能想到这个,更高级点就是正则表达式.但是非常遗憾,这两种方法都是不可行的.当然,在我意识里没有我也没有认知到那个算法可以解决问题,但是Googl

Python学习中的随笔,好记性不如烂笔头

本文 为博主看了 vamei 的blog 写下的随笔 . 致敬Vamei 1.type()   可以显示参数的类型 如 : a=12   type(a) 为 int 2.python的基本类型 为 int float bool string   如 int :  i=1   ,   float :  f=12.5  ,  bool : b= True  or  Flase , string :  s='Hello , word !' 使用前无需声明类型  即 动态类型 3.1序列有 tuple

好记性不如烂笔头48-java拦截器-JDK自带动态代理和CGLIB效率比较(3)

Java中自带的动态代理的类必须要实现一个接口,而且据说使用反射的效率也并不是很高.于是CGLIB就诞生了. 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,理论上比使用Java反射效率要高. 那么我们测试下,这个运行的效率如何. 1. 测试的准备情况 准备1:好记性不如烂笔头46-java拦截器-彻底理解动态代理的概念(1) http://blog.csdn.net/ffm83/article/details/

开篇记(好记性不如烂笔头)

入园两年零三个月,我居然没有一点东西记载下来实在是不应该. 爷爷曾经告诉过我,好记性不如烂笔头.他告诉了我最鲜明的例子.爷爷的脑子一直很好用,记性也是比常人好上一些,当然这也直接导致了爷爷的性格很是高傲.爷爷年轻的时候喜欢舞文弄墨什么的,所以呢每逢人家红白喜事的时候都会去人家及里面瞅上一眼,看看人家送上的喜联或者挽联.有此爱好的还有我的一个另一个宋爷爷,他们经常约好一起的.爷爷老是自信于强悍的记忆能力,每次都是记在脑子中,而宋爷爷却每次都将那些很好的对联记载一个小本子上面.如今爷爷年纪越来越大,

好记性不如烂笔头89-spring3学习(10)-spring3常用schema(持续整理)

Spring3有很多的schema,这些schema对应很多不同的功能.使用这些常用的schema,能让我们避免重复发明轮子,提高我们的开发效率. 我以为这是一个很常见的信息,到网上随便整理下就能完成,可能用的关键词不对,怎么找也没有找到相对比较全面的. 正所谓,好记性不如烂笔头,自己动手把自己能收集到的整理下来,以后需要找资料也能方便点. spring-beans-3.0.xsd 用途:spring3最主要的schema,用于配置bean 命名空间: http://www.springfram