`
relic6
  • 浏览: 74299 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

java关键字敏感字实现过滤替换

阅读更多

很多网站都需要对于某些关键字或者某些敏感词汇进行过滤替换的功能。比如在输入框中输入些js 脚本,或者输入些政府类型的词汇等都是不允许的,但是你不能限制用户的自由。所以对于网站的过滤功能就显得很有必要了。对于一般的网站使用来说,不需要非常复杂的过滤算法等比较高端的实现。简单的用 filter HttpServletRequestWrapper 就可以实现。

HttpServletRequestWrapper 的实现采用了包装模式,具体介绍请另找资料。直接切入正题。实现思路:首先定义一个 properties文件,在文件中存放需要替换的文字和替换后的文字,比如替换 fuck=** ,政府 =** ,替换 <=< >=> (这样就可以避免文本输入的 js 脚本)。然后定义一个类来继承 HttpServletRequestWrapper 达到包装 request对象的作用,最后用一个 filter 使用包装后的 request 对象(即已经经过了过滤作用)。


keyword.properties文件:

CNM=**
fuck=**
<=&lt;
>=&gt;

 

   然后写一个操作properties文件的工具类,PropertiesUtil.java

package com.lhwl.elt.filter;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class PropertiesUtil{
	
	public static Map readProperties(String src) {
		Properties props = new Properties();
		Map map = new HashMap();
		try {
			File file=new File(src);
			InputStream in=new FileInputStream(file);
			props.load(in);
			Enumeration en = props.propertyNames();
			while (en.hasMoreElements()) {
				String key = (String) en.nextElement();
				String value = props.getProperty(key);
				map.put(key, value);//把properties文件中的key-value存放到一个map中
			}
			return map;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static String replaceCheck(Map map,String name) {
		Set<String> keys = map.keySet();
		Iterator<String> iter = keys.iterator();
		while (iter.hasNext()) {
			String key = iter.next();
			String value = (String) map.get(key);
			if (name.contains(key)) {
				name=name.replace(key, value);//对于符合map中的key值实现替换功能
				
			}
		}
		return name;
	}

}

    这里我把从properties文件中读取的key--value的形式都存放到一个map对象中,方法都用static关键字,方便调用。
    然后写了个KeyWordRequestWrapper来继承HttpServletRequestWrapper,实现包装request对象的作用。

package com.lhwl.elt.filter;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public final class KeyWordRequestWrapper extends HttpServletRequestWrapper{
	
	public Map keyMap;
	
	public KeyWordRequestWrapper(HttpServletRequest servletRequest,Map keyMap){
		super(servletRequest);
		this.keyMap = keyMap;
	}
	
	@Override
	public Map getParameterMap() {
		super.getContextPath();
		Map<String,String[]> map = super.getParameterMap();
		if(!map.isEmpty()){
			Set<String> keySet = map.keySet();
			Iterator<String> keyIt = keySet.iterator();
			while(keyIt.hasNext()){
				String key = keyIt.next();
//				String value = map.get(key)[0];
//				map.get(key)[0] = this.replaceParam(value);
				//这边实现对整个数组的判断。
				String[] values=map.get(key);
				for(int i=0;i<values.length;i++){
					map.get(key)[i]=this.replaceParam(values[i]);
				}
			}
		}
		return map;
	}

	
/*	@Override
	public String[] getParameterValues(String name) {
		// TODO Auto-generated method stub
		String[] resources = super.getParameterValues(name); 
		if (resources == null) 
		return null; 
		int count = resources.length; 
		String[] results = new String[count]; 
		for (int i = 0; i < count; i++) { 
			results[i] = this.replaceParam(resources[i]); 
		} 
		return results; 
	}*/

	public String replaceParam(String name){
		return PropertiesUtil.replaceCheck(keyMap,name);
	}
}

    这里由于本人项目的框架原因,框架的request都是使用的getParameterMap来获取的,经过处理了,所以没有使用getParameterValues,可以看到代码中注释掉的方法。覆写了ServletRequestWrapper中的getParameterMap方法来实现包装功能,一般情况下,提交的value数组都只有一个,String value = map.get(key)[0];map.get(key)[0] = this.replaceParam(value);即可满足要求,但为了不出情况,还是实现了对整个数组的过滤替换功能。</div>

   还剩个filter来实现了,先看具体的filter代码:

package com.lhwl.elt.filter;

import java.io.IOException;
import java.util.HashMap;

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.HttpServletRequest;

public class KeyWordFilter implements Filter{
	private FilterConfig filterConfig;
	
	public static HashMap keyMap = null;
	public static String path;
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterConfig=filterConfig;
		String keyWordPath = filterConfig.getInitParameter("key");
		path = filterConfig.getServletContext().getRealPath(keyWordPath);
		
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, 
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest)request;
		if(keyMap == null){
				keyMap = (HashMap)PropertiesUtil.readProperties(path);
		}
		if(req.getMethod().equals("POST")){
			chain.doFilter(new KeyWordRequestWrapper(req,keyMap), response);
		}else{
			chain.doFilter(request, response);
		}
	}

	@Override
	public void destroy() {
		this.filterConfig = null; 
	}

}
 


   这里在filter初始化的时候,就获得项目的真实路径,然后把最先定义的keyword.properties文件放到WEB-INF目录下,定义一个keyWordPath,然后就可以通过在web.xml文件中配置init-param来注入。这里把keyMap和path都定义为static,这样只需要在加载的时候一次初始化就好了。chain.doFilter(new KeyWordRequestWrapper(req,keyMap), response);对于需要过滤的内容进行处理关键字,敏感字等,其他的则正常chain.doFilter(request, response); 最后再web.xml中配置这个filter就可以,注意配置的顺序不要和其他filter冲突就行。web.xml配置:</div>

<!-- 配置过滤关键字 -->
	<filter>
		<filter-name>keyWordFilter</filter-name>
		<filter-class>com.lhwl.elt.filter.KeyWordFilter</filter-class>
		<init-param>
			<param-name>key</param-name>
			<param-value>/WEB-INF/keyword.properties</param-value>
		</init-param>
	</filter>	
	
	<filter-mapping>
		<filter-name>keyWordFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
 

   OK,现在只要输入些properties文件中定义好要替换的内容,则自动的实现了替换功能。比如输入fuck,提交显示出来的就变成了**,对输入的一些js脚本也能够当成文本显示出来了。。。

 

分享到:
评论
4 楼 546181922 2013-01-15  
这个过滤器也不过滤关键字啊。
3 楼 chenzheng8975 2012-11-21  
if(req.getMethod().equals("POST")){ 
            chain.doFilter(new KeyWordRequestWrapper(req,keyMap), response); 
        }else{ 
            chain.doFilter(request, response); 
        } 

大哥我用的是post提交方式,结果执行的是else
2 楼 g061151 2011-12-12  
实际测试貌似不能起到过滤的作用....
1 楼 jspc 2011-08-17  
test
try

thanks

相关推荐

    高效关键字过滤java源码

    最近项目中要用到关键字过滤,就参考网上的算法自己写了个关键字过滤的java代码,思路如下: 将关键词的第1个字作为hashMap的索引,第2个字放到另一个hashMap中,并让第1个字的索引指向这个hashMap 过滤关键字的...

    关键字过滤

    java编写的匹配关键字,并替换关键字,提供关键字设置,替换敏感词 java编写的匹配关键字,并替换关键字,提供关键字设置,替换敏感词 java编写的匹配关键字,并替换关键字,提供关键字设置,替换敏感词 java编写的...

    部分关键字过滤,防止用户使用一些不合理的名称注册

    键字过滤功能自然无比重要,但是如果要在代码中对每个输入进行检查和替换则会是一件非常费神费事的事情。尤其是如果网站已经有了一定规模,用户输入功能已经遍及各处,而急需对所有输入进行关键字过滤时,上述做法更...

    .Net平台高性能关键字过滤组KFilter.zip

    KFilter是.Net平台高性能的关键字过滤组件,它提供了灵活的过滤机制能自适应大小写,半全角,简繁和分隔符处理等。经测试组件在处理处理6000或更多关键词的情况下单线程每秒可以达到上千万字检索的效能。 关键字...

    filter对request请求拦截,对请求参数进行修改

    常用于前台提交表单参数关键字的过滤。此工具可以对参数拦截并转义后提交到对应的处理类。 除了添加两个JsFilter.java和GetHttpServletRequestWrapper.java之外,需要在web.xml添加对应的配置。 &lt;!-- 特殊字符过滤 -...

    疯狂JAVA讲义

    3.2.3 Java关键字 47 3.3 数据类型分类 48 3.4 基本数据类型 48 3.4.1 整型 49 3.4.2 字符型 49 3.4.3 浮点型 51 3.4.4 布尔型 52 3.5 基本类型的类型转换 53 3.5.1 自动类型转换 53 3.5.2 强制类型转化 54...

    Picturebook:ChatCommandSignItem-name过滤器,用于使用可定义的替换项替换关键字。 专为SpigotMC设计

    聊天过滤器,用可定义的替换项替换关键字。 专为SpigotMC设计。 有关命令,配置和权限参考,请参见Wiki。 Picturebook及其代码已获得MIT许可。 请参阅以获取有关MIT许可证的更多信息。 请务必加注星标并关注!

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    书名:《Java开发实战1200例(第I卷)》(清华大学出版社.李钟尉,陈丹丹) PDF格式扫描版,全书分为24章,共817页。2011年1月出版。 全书压缩打包成4部分,这是第3部分 注:本系列图书的第I、II卷再版时均相应改名为...

    javascript用正则表达式把1234567890替换为abcdefghij

    您可能感兴趣的文章:JavaScript利用正则表达式替换字符串中的内容使用JS正则表达式 替换括号,尖括号等JS使用正则表达式过滤多个词语并替换为相同长度星号的方法JS使用正则表达式实现关键字替换加粗功能示例js正则...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    BatchFiles 多功能批量文件处理系统

    BatchFiles 多功能批量文件处理系统,提供五种方式的文件批量重命名(文件名字符替换(-replace)、插入特定字符到文件名中(-insert)、文件名截取(-intercept)、文件名的大小写转换(-toggle)和重命名恢复(-...

    Java开发技术大全 电子版

    Java开发技术大全 电子版 第1篇Java基础知识入门. 第1章Java的开发运行环境2 1.1Java的运行环境与虚拟机2 1.2Java的开发环境4 1.2.1JDK的安装4 1.2.2如何设置系统环境变量6 1.2.3编译命令的使用8 1.2.4解释...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    java恶意代码检测源码-ac:带有双阵列Trie的Aho-Corasick自动机(go中的多模式替代)

    多模式匹配(替换)具有很强的现实意义与实用价值:敏感词过滤,病毒特征码搜索等。 字典中约有一千条关键字,分为三大类:电影、音乐、电影&音乐,将输入文本中的字典记录替换为相应的类别文本。遵循贪婪原则与最先...

    PacketProxy:用Java编写的本地代理

    通过关键字过滤/搜索数据包 拦截数据包,并在将其发送到服务器之前对其进行修改 重新发送数据包到服务器 显示任何两个接收到的数据包之间的差异 许多协议支持 支持HTTP1,HTTP2,HTTPS,WebSocket,FireBase,MQTT,...

Global site tag (gtag.js) - Google Analytics