`
relic6
  • 浏览: 74833 次
  • 性别: 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编写的...

    WEB项目中实现屏蔽关键字代码

    6. **安全考虑**:除了基本的关键字过滤,还应注意SQL注入和XSS攻击。使用PreparedStatement防止SQL注入,对用户输入进行转义或使用HTML sanitization库防止XSS。 7. **日志记录**:记录被屏蔽的关键字和相关用户...

    jsp页面中关键字过滤函数

    1. **JavaBean**:为了实现关键字过滤,我们可以创建一个JavaBean类,该类负责处理关键字过滤的业务逻辑。这个类可以包含一个方法,比如`filterKeywords(String input)`,接受用户输入的内容,然后返回过滤后的字符...

    基于jsp的非法关键字过滤功能

    本项目"基于jsp的非法关键字过滤功能"专注于使用JavaServer Pages(JSP)来实现这一功能,对于学习如何在Web应用中实施安全策略的开发者来说具有很高的参考价值。 JSP是Java平台上的一个服务器端脚本语言,它允许...

    java 请求参数过滤拦截

    在Java开发中,请求参数过滤拦截是一个至关重要的环节,它涉及到系统的安全性、稳定性和数据的正确性。这里的“java请求参数过滤拦截”主要是指在接口接收到用户输入的数据时,通过过滤器(Filter)对参数进行检查,...

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

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

    oak:敏感字(关键字)过滤

    Oak项目中的"敏感字(关键字)过滤"模块,是实现这一功能的一个具体实例,它主要涉及到Java编程语言的应用。 Java作为一种广泛使用的编程语言,拥有丰富的库和框架来处理各种任务,包括文本处理和过滤。在Oak项目...

    java 日志的数据脱敏的实现方法

    另一个方法是通过日志框架(如Log4j或SLF4J)设置过滤器,匹配并替换特定的敏感关键字。但这可能会导致性能下降,因为每个日志输出都要进行正则匹配。 为了克服上述两种方法的局限,可以采取一种混合策略,即在...

    Java敏感词过滤Java敏感词过滤

    本篇文章详细介绍了Java敏感词过滤技术的实现方法,包括敏感词库的加载、正则表达式的构建以及过滤逻辑的具体实现。通过对这些关键技术点的理解,可以帮助开发者更好地设计和实现自己的敏感词过滤系统。

    JavaScript 过滤关键字

    本文介绍了一个在JavaScript中过滤关键字的方法,该方法可以被用于网页中,实现对特定关键字的高亮显示。 首先,文中给出了过滤关键字的基本思路。关键步骤包括定义一个包含关键字的数组,使用正则表达式将这些...

    使用log4j2实现日志数据脱敏

    在自定义过滤器的实现中,你可以遍历日志消息,查找并替换敏感字段。例如,可以使用正则表达式匹配用户名、密码等关键字,并用占位符替换。 四、使用插件实现脱敏 Log4j2允许通过插件系统扩展其功能。一些第三方库...

    ListView搜索关键字高亮显示

    2. **文本替换**:遍历每个列表项的新闻标题或描述,查找是否存在关键字。如果找到,可以使用SpannableString和ForegroundColorSpan来高亮显示匹配的部分。例如: ```java String searchText = "关键字"; // 用户...

    Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音

    可以使用Java的`filter()`方法或者遍历整个数据集,根据关键字匹配数据项,生成新的过滤后的列表。 3. 更新ListView:使用过滤后的列表重新填充Adapter,并调用`notifyDataSetChanged()`通知ListView数据已更新。 ...

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

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

    字符串过滤工具类,不错的类

    关键字过滤可能包括但不限于删除、替换或标记含有特定关键字的字符串部分。 1. **关键字列表**:这是过滤器的核心,可以是一个静态的字符串数组,也可以是动态加载的配置文件。开发者可以根据业务需求定义哪些词汇...

    java使用正则表达式过滤html标签

    标签“java过滤html标签 java正则过滤html标签 java过滤所有html标签”则指明了文章的具体技术范畴和读者可以利用的关键字。 在内容部分,文章提供了一个名为`HtmlRegexpUtil`的工具类,该类是专门用于处理HTML标签...

    paoding查询关键字匹配到的个数的实例

    在Java中,你可以使用Analyzer的`tokenStream`方法配合TokenStream接口的子类来实现关键字匹配计数。以下是一个简单的示例: ```java String text = "这是要搜索的关键字所在的文本"; String keyword = "关键字"; ...

Global site tag (gtag.js) - Google Analytics