当前位置:首页 > > 充电吧
[导读]很多网站都需要对于某些关键字或者某些敏感词汇进行过滤替换的功能。比如在输入框中输入些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脚本也能够当成文本显示出来了。。。

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

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭