日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 充電吧
[導(dǎo)讀]很多網(wǎng)站都需要對(duì)于某些關(guān)鍵字或者某些敏感詞匯進(jìn)行過(guò)濾替換的功能。比如在輸入框中輸入些js 腳本,或者輸入些政府類型的詞匯等都是不允許的,但是你不能限制用戶的自由。所以對(duì)于網(wǎng)站的過(guò)濾功能就顯得很有必要了

很多網(wǎng)站都需要對(duì)于某些關(guān)鍵字或者某些敏感詞匯進(jìn)行過(guò)濾替換的功能。比如在輸入框中輸入些js 腳本,或者輸入些政府類型的詞匯等都是不允許的,但是你不能限制用戶的自由。所以對(duì)于網(wǎng)站的過(guò)濾功能就顯得很有必要了。對(duì)于一般的網(wǎng)站使用來(lái)說(shuō),不需要非常復(fù)雜的過(guò)濾算法等比較高端的實(shí)現(xiàn)。簡(jiǎn)單的用 filter 和 HttpServletRequestWrapper 就可以實(shí)現(xiàn)。

HttpServletRequestWrapper 的實(shí)現(xiàn)采用了包裝模式,具體介紹請(qǐng)另找資料。直接切入正題。實(shí)現(xiàn)思路:首先定義一個(gè) properties文件,在文件中存放需要替換的文字和替換后的文字,比如替換 fuck=** ,政府 =** ,替換 <=< 和 >=> (這樣就可以避免文本輸入的 js 腳本)。然后定義一個(gè)類來(lái)繼承 HttpServletRequestWrapper 達(dá)到包裝 request對(duì)象的作用,最后用一個(gè) filter 使用包裝后的 request 對(duì)象(即已經(jīng)經(jīng)過(guò)了過(guò)濾作用)。


keyword.properties文件:


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


然后寫一個(gè)操作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存放到一個(gè)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);//對(duì)于符合map中的key值實(shí)現(xiàn)替換功能
				
			}
		}
		return?name;
	}

}

這里我把從properties文件中讀取的key--value的形式都存放到一個(gè)map對(duì)象中,方法都用static關(guān)鍵字,方便調(diào)用。
? ? 然后寫了個(gè)KeyWordRequestWrapper來(lái)繼承HttpServletRequestWrapper,實(shí)現(xiàn)包裝request對(duì)象的作用。


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);
				//這邊實(shí)現(xiàn)對(duì)整個(gè)數(shù)組的判斷。
				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);
	}
}


這里由于本人項(xiàng)目的框架原因,框架的request都是使用的getParameterMap來(lái)獲取的,經(jīng)過(guò)處理了,所以沒(méi)有使用 getParameterValues,可以看到代碼中注釋掉的方法。覆寫了ServletRequestWrapper中的 getParameterMap方法來(lái)實(shí)現(xiàn)包裝功能,一般情況下,提交的value數(shù)組都只有一個(gè),String value = map.get(key)[0];map.get(key)[0] = this.replaceParam(value);即可滿足要求,但為了不出情況,還是實(shí)現(xiàn)了對(duì)整個(gè)數(shù)組的過(guò)濾替換功能。

?? 還剩個(gè)filter來(lái)實(shí)現(xiàn)了,先看具體的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初始化的時(shí)候,就獲得項(xiàng)目的真實(shí)路徑,然后把最先定義的keyword.properties文件放到WEB-INF目錄下,定義一個(gè) keyWordPath,然后就可以通過(guò)在web.xml文件中配置init-param來(lái)注入。這里把keyMap和path都定義為static,這 樣只需要在加載的時(shí)候一次初始化就好了。chain.doFilter(new KeyWordRequestWrapper(req,keyMap), response);對(duì)于需要過(guò)濾的內(nèi)容進(jìn)行處理關(guān)鍵字,敏感字等,其他的則正常chain.doFilter(request, response); 最后再web.xml中配置這個(gè)filter就可以,注意配置的順序不要和其他filter沖突就行。web.xml配置:


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


OK,現(xiàn)在只要輸入些properties文件中定義好要替換的內(nèi)容,則自動(dòng)的實(shí)現(xiàn)了替換功能。比如輸入fuck,提交顯示出來(lái)的就變成了**,對(duì)輸入的一些js腳本也能夠當(dāng)成文本顯示出來(lái)了。。。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉