当前位置:首页 > 芯闻号 > 充电吧
[导读]很多网站都需要对于某些关键字或者某些敏感词汇进行过滤替换的功能。比如在输入框中输入些js 脚本,或者输入些政府类型的词汇等都是不允许的,但是你不能限制用户的自由。所以对于网站的过滤功能就显得很有必要了

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

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


keyword.properties文件:


CNM=**  
fuck=**  
<=<  
>=>


然后写一个操作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) {
		Setkeys = map.keySet();
		Iteratoriter = 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();
		Mapmap = super.getParameterMap();
		if(!map.isEmpty()){
			SetkeySet = map.keySet();
			IteratorkeyIt = 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);即可满足要求,但为了不出情况,还是实现了对整个数组的过滤替换功能。

   还剩个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配置:


keyWordFiltercom.lhwl.elt.filter.KeyWordFilterkey/WEB-INF/keyword.propertieskeyWordFilter/*


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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭