www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

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

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


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值實現(xiàn)替換功能
				
			}
		}
		return?name;
	}

}

這里我把從properties文件中讀取的key--value的形式都存放到一個map對象中,方法都用static關(guān)鍵字,方便調(diào)用。
? ? 然后寫了個KeyWordRequestWrapper來繼承HttpServletRequestWrapper,實現(xiàn)包裝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);
				//這邊實現(xiàn)對整個數(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);
	}
}


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

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


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


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

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉