1. 程式人生 > >過濾器應用案例分析

過濾器應用案例分析

----------------------------------------------------------------------------------------------
[版權申明:本文系作者原創,轉載請註明出處
文章出處:http://blog.csdn.net/sdksdk0/article/details/52077359
作者:朱培      ID:sdksdk0      郵箱: [email protected]   

--------------------------------------------------------------------------------------------

本文主要分享的內容是通過使用過濾器解決全站亂碼、Html過濾、髒話過濾、Gzip壓縮過濾等主要內容,是一個切實解決網站實際問題的一套方案。

一、過濾器簡介

Filter,對web伺服器管理的所有web資源對請求和響應物件進行攔截。例如實現URL級別的許可權訪問控制、過濾敏感資訊。

下面來看一下過濾器的執行過程和生命週期

生命週期

初始化:當應用被載入時,由伺服器呼叫預設的構造方法,並接著呼叫初始化方法。
doFilter:一直伴隨著應用程式而存在,使用者每次訪問被過濾的資源,都會呼叫doFilter方法。
銷燬:應用被解除安裝的時候。


執行過程

1、在javaweb伺服器:伺服器啟動時載入應用,載入應用的配置檔案web.xml,例項化過濾器並初始化。
2、瀏覽器請求index.jsp。
3、建立request和response,經過過濾器,呼叫request,response,FilterChain。
4、通過FilterChain()處理。

開發步驟

1、寫一個類,繼承Filter介面
2、配置web.xml。指定需要過濾的資源

    <!-- 定義過濾器 -->
	<filter>
		<filter-name>Demo1</filter-name>
		<filter-class>cn.tf.filter.Demo1</filter-class>
	</filter>
	
	<!-- 對映要過濾的資源 -->
	<filter-mapping>
		<filter-name>Demo1</filter-name>
		<url-pattern>/index.jsp</url-pattern>
	</filter-mapping>


二、全站亂碼

我們以前對於網站亂碼的問題大多數是直接在servlet中rerquest.setCharacterEncoder("UTF-8")這樣來解決,但是對於多個servlet重複也的話就非常不好了,及其不方便,所以我們可以使用一個過濾器來對整站的編碼進行設定。

新建一個類SetCharacterEncodingFilter,使其繼承Filter介面。然後實現其3個生命週期方法init()、doFilter()、destroy(),當然,我們需要對其doFilter方法進行操作了。在這裡面設定編碼就可以了

public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		String encoding = filterConfig.getInitParameter("encoding");
		if(encoding==null)
			encoding = "UTF-8";
		
		request.setCharacterEncoding(encoding);//解決POST請求引數編碼
		response.setCharacterEncoding(encoding);//更改響應字元流使用的編碼
		response.setContentType("text/html;charset="+encoding);//更改響應字元流使用的編碼,還能告知瀏覽器用什麼編碼進行顯示
		chain.doFilter(request, response);
	}
使用chain.doFilter釋放攔截。

然後我們就到web.xml中去配置一個這個過濾器。這個找到你直接的類路徑就可以了,/*是萬用字元,表示全站過濾,如果你只想要過濾某一種型別的檔案,只需要修改相應的<url-pattern>就可以了,例如是想要jsp的格式改變,就改成*.jsp即可。

<filter>
	  	<filter-name>SetCharacterEncodingFilter</filter-name>
	  	<filter-class>cn.tf.filter.SetCharacterEncodingFilter</filter-class>
	  </filter>
	  <filter-mapping>
	  	<filter-name>SetCharacterEncodingFilter</filter-name>
	  	<url-pattern>/*</url-pattern>
	  </filter-mapping>


三、Html過濾

對於一個網站來說,進行html過濾是非常有必要的,因為在執行某些操作的時候,很有看通過html檔案對你的網站注入html進行攻擊,一方面防止攻擊,一方面使使用者體驗度更好,所以我們常常需要進行html標籤過濾。

首先新建一個類HtmlFilter,使其繼承Filter介面,在doFilter中進行操作。

public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request;
		HttpServletResponse response;
		
		try {
			request=(HttpServletRequest) req;
			response=(HttpServletResponse) resp;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
		HttpServletRequest hrequest=new HtmlHttpServletRequest(request);
		chain.doFilter(hrequest,response);
		
	}
這裡我們把HtmlHttpServletRequest寫出來
class HtmlHttpServletRequest extends HttpServletRequestWrapper{

	public HtmlHttpServletRequest(HttpServletRequest request) {
		super(request);
		
	}
	
	@Override
	public String getParameter(String name) {
		
		String value=super.getParameter(name);
		if(value==null)
			return null;
		value=filter(value);
		return value;
	}

	private String filter(String message) {
		 if (message == null)
	            return (null);

	        char content[] = new char[message.length()];
	        message.getChars(0, message.length(), content, 0);
	        StringBuilder result = new StringBuilder(content.length + 50);
	        for (int i = 0; i < content.length; i++) {
	            switch (content[i]) {
	            case '<':
	                result.append("<");
	                break;
	            case '>':
	                result.append(">");
	                break;
	            case '&':
	                result.append("&");
	                break;
	            case '"':
	                result.append(""");
	                break;
	            default:
	                result.append(content[i]);
	            }
	        }
	        return (result.toString());
	}
	}
	




同樣的,我們需要在web.xml中進行配置

 <!-- 過濾html -->
	 <filter>
	 <filter-name>HtmlFilter</filter-name>
	  	<filter-class>cn.tf.filterHtml.HtmlFilter</filter-class>
	  </filter>
	  <filter-mapping>
	  	<filter-name>HtmlFilter</filter-name>
	  	<url-pattern>/*</url-pattern>
	  </filter-mapping>

處理前效果:


處理後:


四、髒話過濾

對於髒話過濾在一些論壇網站等都是非常常見的功能,實現這個功能的方法非常多,你可以直接用js來做判斷也是可以,這裡我介紹的是另一種方法,就是通過過濾器來對髒話進行過濾,把髒話都替換為*號。

同樣的,新建一個類DirtyWordsFilter.java,實現其Filter介面。

public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request;
		HttpServletResponse response;
		
		try {
			request=(HttpServletRequest) req;
			response=(HttpServletResponse) resp;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
		DWHttpServletRequest  dwrequest=new DWHttpServletRequest(request) ;
		chain.doFilter(dwrequest, response);
	}
在這裡對髒話進行處理。
class DWHttpServletRequest extends HttpServletRequestWrapper{

		private String[] strs={"傻逼","人妖","他媽的"};
		
		public DWHttpServletRequest(HttpServletRequest request) {
			super(request);
			
		}
		
		@Override
		public String getParameter(String name) {
			String value=super.getParameter(name);
			if(value==null)
				return null;
			
			for(String s:strs){
				value=value.replace(s, "**");
			}
			return value;
		}
		
	}

處理前效果:


處理後效果:


五、Gzip壓縮

在網站資料傳輸的時候,我們通常為了節省流量,加快傳輸速度等原因,通常需要把檔案進行壓縮,不但是使用者請求的頁面,例如當用戶訪問你的index.html頁面的時候,從你的伺服器傳輸到使用者的客戶端,如果直接傳輸整個人html頁面是很耗資源的(當然是對於大量使用者訪問),所以我們需要把頁面壓縮之後再傳輸,這個我們就可以通過過濾器來實現了。

新建GzipFilter.java,使其繼承Filter介面。

public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request;
		HttpServletResponse response;
		
		try {
			request=(HttpServletRequest) req;
			response=(HttpServletResponse) resp;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		
		MyHttpServletResponse  mresponse=new MyHttpServletResponse(response);
		chain.doFilter(request, mresponse);
		
		//獲取原始資料
		byte b[] = mresponse.getOldData();
		System.out.println("壓縮前:"+b.length);
		//GZIP壓縮
		ByteArrayOutputStream out = new ByteArrayOutputStream();//記憶體位元組快取輸出流
		GZIPOutputStream gout = new GZIPOutputStream(out);
		gout.write(b);
		gout.close();//壓縮後的資料寫到了ByteArrayOutputStream中了
		
		b = out.toByteArray();//取出壓縮後的資料
		System.out.println("壓縮後:"+b.length);
		//告知客戶端正文的壓縮方式:gzip
		response.setHeader("Content-Encoding", "gzip");
		response.setContentLength(b.length);//響應訊息頭,告知客戶端正文的長度
		response.getOutputStream().write(b);	
	}

對字元流、位元組流進行處理。
class MyHttpServletResponse  extends HttpServletResponseWrapper{

		private ByteArrayOutputStream baos=new ByteArrayOutputStream();
		private PrintWriter pw = null;
		public MyHttpServletResponse(HttpServletResponse response) {
			super(response);
			
		}
		
		//截獲資料:字元流
		public PrintWriter getWriter() throws IOException {
			pw = new PrintWriter(new OutputStreamWriter(baos, super.getCharacterEncoding()));
			return pw;
		}
		
		//截獲資料:位元組流
		public ServletOutputStream getOutputStream() throws IOException {
			return new MyServletOutputStream(baos);
		}
	
		//返回擷取的資料
		public byte[] getOldData(){
			try {
				if(pw!=null){
					pw.close();
				}
				baos.flush();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			return baos.toByteArray();
		}
		
	}
	
		class MyServletOutputStream extends ServletOutputStream{

			private ByteArrayOutputStream  baos;
			
			public MyServletOutputStream(ByteArrayOutputStream baos){
				this.baos=baos;
			}
			
			@Override
			public void write(int b) throws IOException {
				baos.write(b);
				
			}
			
		}

當然,我們同樣要在web.xml中配置。這裡的話我們不需要全部過濾,只需要過濾jsp、html、js、css型別的即可。
<!-- GZIP壓縮 -->
 <filter>
	 <filter-name>GzipFilter</filter-name>
	  	<filter-class>cn.tf.filterHtml.GzipFilter</filter-class>
	  </filter>
	  <filter-mapping>
	  	<filter-name>GzipFilter</filter-name>
	  	<url-pattern>*.jsp</url-pattern>
	  </filter-mapping>
	  	  <filter-mapping>
	  	<filter-name>GzipFilter</filter-name>
	  	<url-pattern>*.html</url-pattern>
	  </filter-mapping>
	  	  <filter-mapping>
	  	<filter-name>GzipFilter</filter-name>
	  	<url-pattern>*.js</url-pattern>
	  </filter-mapping>
	  	  <filter-mapping>
	  	<filter-name>GzipFilter</filter-name>
	  	<url-pattern>*.css</url-pattern>
	  </filter-mapping>
在servlet中使用:
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String data="你們好啊fyufbdljsbcjlksdnckdnjkdhjfbjcnjdjkdsnkklqispkxlndkehlfehihiohfdidsisildnckdnilfiefilefkkdhwgflkfnioufhyoinckdnckllhdefwvvewfefrvb54eqgdfbfdbgsfngfnhggfns";
		PrintWriter out = response.getWriter();
		out.write(data);
	}


使用Gzip壓縮我們需要注意的是,資料量如果太小了的話,壓縮之後會變更大了,資料量至少應該在150個位元組以上的再壓縮,否則會適得其反。

總結:本文主要是通過四個常用的案例來說明了Filter過濾器的使用,都是一些非常簡單易用的知識。對於一名合格的開發者來說,這些知識都是必須要掌握的。共勉!歡迎關注!

相關推薦

過濾器應用案例分析

----------------------------------------------------------------------------------------------[版權申明:本文系作者原創,轉載請註明出處] 文章出處:http://blog.csdn

軟體成本度量體系建設應用案例分析

面臨問題: 1、如何量化研發部門的研發產出和價值: 隨著該行組織級量化管理的不斷提升,高層領導對資訊化管理提出了新的要求,金融資訊化每年投入了大量的人力,如何能客觀地量化相應的產出? 2、傳統功能點方法(IFPUG)難以應用在專案早期: 2008年軟體中心引入的IFPUG傳統

軟體成本度量:能源行業應用案例分析

一、組織簡介 單位型別:內部乙方 所屬行業:能源 應用場景:專案核算 應用部門簡介:該公司為某大型石油集團的下屬子公司,主要業務是為集團公司提供資訊系統技術開發和諮詢服務,專注於地理資訊系統(GIS)、綜合業務管理資訊系統、圖形影象及網路應用軟體的研究、設計、開發與建設,以及數字管道

能源行業軟體成本第三方評估應用案例分析

一、組織簡介 單位型別:內部乙方 所屬行業:能源 應用場景:專案核算 應用部門簡介:該公司為某大型石油集團的下屬子公司,主要業務是為集團公司提供資訊系統技術開發和諮詢服務,專注於地理資訊系統(GIS)、綜合業務管理資訊系統、圖形影象及網路應用軟體的研究、設計、開發與建設,以及數字管道

K-means聚類演算法原理分析與實際應用案例分析案例分析另起一篇部落格)

引言 在資料分析中,我們常常想將看上去相似或者行為形似的資料聚合在一起。例如,對一個營銷組織來說,將不同客戶根據他們的特點進行分組,從而有針對性地定製營銷活動,這很重要。又比如,對學校老師來說,將學生分組同樣能夠有所側重的進行教育活動。分類與聚類是資料探勘領域

Java-Web過濾器應用案例

這裡我們的案例主要表現前兩個應用場景,即驗證是否已經登陸還有編碼轉換。 這裡我們先寫一個登陸jsp,還有成功的頁面以及失敗的頁面,同時建立servlet 登陸頁面 <body> <h1>歡迎訪問本網站,請登入</h1&

IDC機房KVM應用案例分析

IDC機房KVM應用案例分析 一、背景介紹 隨著資訊科技的發展,各行各業都在馬不停蹄的開展著各自的資訊化建設步伐。對於設計製造創新科技產品為執行主業的設計院而言,內部IT基礎裝置與機房管理結構的完善與否,將會直接影響產品生產能力。尤其在面對產能規模日趨擴大的狀況下,其機房系統與伺服器的管理數量及應用複雜程度

ADO.Net之SqlConnection、 Sqlcommand的應用學習心得(思維導圖,知識解析,案例分析

ros statistic system 啟動 clone() 連接字符串 esp ans 用戶 ADO.Net之SqlConnection、 Sqlcommand的應用 一、思維導圖: ADO.NET與SQL連接: 二、知識點介紹: SqlConnecti

vue的過濾器語發及應用案例

str tid slice 價格 取代 四舍五入 tof ssa value 1.使用地方: 雙花括號插值處或 組件屬性處 例: {{ message | capitalize }} <div v-bind:id="rawId | formatId">&

NB-IoT在智慧城市中應用案例分析

實現新智慧城市應用的主要要求之一是部署無線接入網路,該網路可以降低耗電量,覆蓋廣泛區域,有效地為低成本裝置供電,並匹配運營商的不同頻譜分配。在智慧城市應用中,NB-IoT可以廣泛應用於智慧計量,物業監控,農業,車隊和物流管理等資料傳輸量少但需要大面積部署的領域,並且,通常很多領域的裝置位置位於地下、農場、森林

Java技術學習筆記:過濾器鏈的實現方法、配置和案例分析

今天給大家分享的是Java技術學習筆記:過濾器鏈的實現方法、配置和案例分析。 過濾器能夠對網站中的各種內容進行過濾(頁面、Servlet、圖片、檔案),可以在網站內容請求和響應時進行一些操作,完成一些通用的功能。 過濾器鏈 在專案中可以建立多個過濾器,網站內容可能會經過多個過濾器,多個過濾器就形成了過濾

java技術學習總結:過濾器鏈的實現方法、配置和案例分析

今天給大家分享的是Java技術學習總結:過濾器鏈的實現方法、配置和案例分析。 過濾器能夠對網站中的各種內容進行過濾(頁面、Servlet、圖片、檔案),可以在網站內容請求和響應時進行一些操作,完成一些通用的功能。 過濾器鏈 在專案中可以建立多個過濾器,網站內容可能會經過多個過濾器,多個過

分析TVS管在應用案例中真正的威力

    TVS管用於熱插拔電路保護   在熱插拔應用中,TVS管主要用作需要被中斷的差模電流的接地分流路徑。熱插拔系統常被用在分散式電源系統中提供可靠的系統保護和電氣管理,典型**器系統的線卡介面和熱插拔電路原理圖如圖1所示。   從本質上講,當檢測到故障和電流中斷期間的電流轉換率可能達

4大案例分析金融機構的大資料應用

就“大資料+金融”思維利用而言,國外金融機構有著十足豐富的體現,已經將大資料技術在風險控制、運營管理、銷售支援及商業模式創新等領域進行了全面的嘗試。 案例一:匯豐銀行-風險管理 匯豐銀行在防範信用卡和借記卡欺詐的基礎上,利用SAS構建了一套全球業務網路的防欺詐管理系統,

案例分析 --構造方法,程式碼塊,重寫 的應用

案例分析 –構造方法,程式碼塊,重寫 的應用 參考資料: 掌握java中的三種程式碼塊的定義及使用 java中構造方法和方法全面解析 1. 分析下面程式碼 的結果 public class HDemo { public static

HBase建表高階屬性,hbase應用案例看行鍵設計,HBase和mapreduce結合,從Hbase中讀取資料、分析,寫入hdfs,從hdfs中讀取資料寫入Hbase,協處理器和二級索引

1. Hbase高階應用 1.1建表高階屬性 下面幾個shell 命令在hbase操作中可以起到很到的作用,且主要體現在建表的過程中,看下面幾個create 屬性 1、 BLOOMFILTER 預設是NONE 是否使用布隆過慮及使用何種方式 布隆

LDA線性判別分析原理及python應用(葡萄酒案例分析

目錄 線性判別分析(LDA)資料降維及案例實戰   一、LDA是什麼   二、計算散佈矩陣   三、線性判別式及特徵選擇   四、樣本資料降維投影   五、完整程式碼   結語   一、LDA是什麼 LDA概念及與PCA區別 LDA線性判別分析(Linear Discriminant Anal

《大型網站技術架構:核心原理與案例分析》-- 讀書筆記 (5) :網購秒殺系統

案例 並發 刷新 隨機 url 對策 -- 技術 動態生成 1. 秒殺活動的技術挑戰及應對策略 1.1 對現有網站業務造成沖擊 秒殺活動具有時間短,並發訪問量大的特點,必然會對現有業務造成沖擊。對策:秒殺系統獨立部署 1.2 高並發下的應用、

【Spark深入學習 -12】Spark程序設計與企業級應用案例02

提升 算子 lin count() roi println groupby 工作問題 衍生 ----本節內容------- 1.遺留問題答疑 1.1 典型問題解答 1.2 知識點回顧 2.Spark編程基礎 2.1 Spark開發四部曲 2.2 RDD典型實例

集合應用案例:編寫程序實現學生信息管理系統的錄入登錄

else 系統 tput img efault () 創建 輸入輸出 public 本編文章主要介紹一個關於集合的應用案例:完成班級學員錄入功能 (沒有持久化操作,每次重啟錄入的信息都保存不了) 一、需求: 創建學生類:添加以下屬性以及相應的構造函數!使用集合保存學員信息!