1. 程式人生 > >Servlet容器Filter的使用(Filter解決亂碼問題例項)

Servlet容器Filter的使用(Filter解決亂碼問題例項)


        這一切還要從亂碼講起....場景:

是這樣子的,在做使用者新增和修改模組的時候,做完了之後,在填寫使用者名稱的時候,如果我們輸入中文的話,提交到

資料庫中, 發現數據庫中的程式碼是亂碼. 於是去網上查了查關於中英文亂碼的事,怎麼會提交到資料庫中的漢字變成

了亂碼呢? 我們在這個jsp頁面的開始明確給出了頁面的編碼格式:<%@ page language="java"

conntentType="text/html; charset=GB18030"  pageEncoding="GB18030"%>  GB18030代表的是漢字的編碼的,怎麼

會出現的亂碼?

 jsp標頭檔案的程式碼.   

 

charset和pageEncoding的區別:

charset是指伺服器傳送給客戶端時的內容編碼.

pageEncoding是指JSP檔案本身的編碼.如果改為'UTF-8'的話,那JSP原始檔就不能寫漢字了.所以我們在最初設定

的JSP本身的編碼和伺服器傳送給客戶端的編碼都是 GB18030,即中文編碼.

而我們為什麼要進行編碼呢?

從現實世界中到計算機中要進行轉換,從現實的事務邏輯要轉換成計算機能表達的事務邏輯,我們用符號進行表示

的.計算機的世界中是0和1的,而編譯器是識別英文的,我們的code是英文的,我們的中文是需要進行"翻譯"的,翻譯成

編譯器可以識別的, 如果你的編碼是中文的編碼,這樣當你輸入中文的時候編譯器會給你增加一層翻譯. 如果你的編

碼是英文的,而你輸入了中文, 這樣就會出現亂碼問題. 

亂碼問題.

我們新增使用者或修改使用者的時候, 我們提交資料的時候, 是我們在觸發一個事件, 手動的把我們填寫的內容提

交到伺服器,再新增到資料庫中. 當我們手動進行提交的時候,向伺服器傳送資料的時候, 預設的編碼不是中文的編

碼,所以我們在提交的時候首先要設定一下編碼格式, 然後再向資料庫中寫入.

於是我們在jsp頁面程式碼上新增這樣的語句:request.setCharacterEncoding("GB18030");  這樣的話,我們再寫

入資料庫的時候,從介面上輸入中文就不會出現那樣的錯誤了. 我們設定一下提交資料的編碼為中文編碼.

但是問題又來了, 在面對亂碼問題中, 一個新增使用者需要設定, 一個修改使用者需要設定,其他的模組呢? 其他的

任何一個向資料庫中寫入資料的jsp都要進行設定, 都要寫上這樣的一句話, 那上千條呢? 上千句呢? 即使是提取出

一個方法來, 我們去呼叫這個方法也是要呼叫上千次的, 對於每個表單都要進行轉碼, 這樣的重複的工作是讓人頭疼

的.

而Filter能解決我們這樣的問題, 這就揭開Filter神祕的面紗.

Filter英文含義是 "過濾" ,想想日常生活中的過濾器, 我們的水經過過濾更加純淨了 ,我們喝起來的時候會十

分的放心; 廚房用的"漏勺"給我們提供了很大的方便; 而我們計算機世界中的"過濾器",功能是在伺服器和客戶端中間增加了一箇中間層(類似於外觀模式中間也是加了一層~~),可以對兩者之間的互動進行統一的處理,每一個客戶端

提交的請求都需要通過過濾器的處理, 然後再進行其他的操作.

在實際開發中,過濾器可以對使用者統一的身份判斷,ip訪問限制, 使用者傳送請求字元編碼轉換, 對請求和響應進行

加密和解密, 記錄使用者登入日誌等. 當然過濾器的使用者不僅僅這些, 我們可以隨機應變,靈活應用~~~

在解決亂碼中我們遇到了問題, 我們可以用Filter首先進行編碼的轉換, 然後傳達到jsp頁面的時候就不會出現任何的問題.

Filter:

我們檢視j2ee的幫助文件可以看到Filter的位置:

以及FilterChain FilterConfig, 可以看到我們的Filter是在javax.servlet包中 , Filter為servlet包中的一

個介面. Java Servlet API包括兩個基本的包, 是編寫Servlet必須要實現的,javax.servlet.http提供了處理與Http

相關的操作類和介面,每個Servlet必須實現Servlet介面,實際中我們的servlet通常是繼承javax.http.HttpServlet,

而Filter過濾器實際上就是Servlet的過濾器,Filter過濾器是屬於Servlet基本技術.

我們新增的自己的容器程式碼,實現javax.servlet.Filter介面

package com.bjpowernode.drp.util.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * 採用Filter統一處理字符集.
 * @author Summer
 *
 */
public class CharsetEncodingFilter implements Filter {

	//定義成員變數.
	private String encoding;
	//銷燬.
	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}
	
	/**
	 * 過濾器真正執行的處理功能.
	 */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		//System.out.println("CharacterEncodingFilter--begin");
		//設定字符集.
		request.setCharacterEncoding(encoding);
		
		//拿到鏈條繼續向下呼叫.
		 chain.doFilter(request, response);
		 //返回了.
		 //System.out.println("CharacterEncodingFilter--end");

	}
	
	/**
	 * 過濾器初始化時候呼叫.
	 * 我們在初始化的時候呼叫
	 * 從web.xml中讀取配置檔案 讀取encoding資料.
	 */
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		this.encoding = filterConfig.getInitParameter("encoding");
		
	
	}

}

我們解釋一下一些程式碼:

檢視API文件,我們就會看到這個介面的三個方法,所以我們的過濾器, 要去實現人家j2ee的容器規範. 說說這三

個方法的含義(API文件上也有):

A:init():初始化過濾器,初始化過濾器的工作就是從配置檔案中讀取引數的內容.

B:doFilter():很明顯do(做)Filter(容器),這個方法的功能就是這個過濾器真正要執行的處理功能,我們這裡設定字符集就是從這裡設定的.

C:destory():這個方法很明顯,銷燬回收過濾器.(用完了之後釋放)

在我們的這個過濾器中,init()方法是從配置檔案中讀取字元編碼格式的引數,在doFilter()方法中使用request物件對所有的請求統一編碼格式.

我們的Web.xml配置檔案:

<filter>
		<filter-name>CharsetEncodingFilter</filter-name>
		<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>GBK</param-value>
		</init-param>
	</filter>
	
	<!-- 對哪些起作用,對jsp還是servlet -->
	<filter-mapping>
		<filter-name>CharsetEncodingFilter</filter-name>
		<!-- 配置一下,讓誰使用Filter,這裡配置的是對所有的jsp起作用 -->
		
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>


<filter-name>:是過濾器名字.

<filter-class>: 是過濾器實現的filter介面名字

<init-param>:是在初始化過濾器的時候,預設的設定會從這裡查詢.

<url-pattern>:匹配項,過濾那些東東?指明瞭所有jsp的請求都使用我們的字元編碼過濾器進行轉碼處理. 這樣就避免了對每一個請求都要進行編碼,從而大大減少了工作量.  

下面在用一張圖來表示我們過濾器的工作原理:

我們也可以看到Filter詳細的呼叫流程啦.   Filter--Servlet容器.

相關推薦

表單提交servlet的兩種解決亂碼方式

@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOExcepti

Servlet容器Filter的使用(Filter解決亂碼問題例項)

        這一切還要從亂碼講起....場景: 是這樣子的,在做使用者新增和修改模組的時候,做完了之後,在填寫使用者名稱的時候,如果我們輸入中文的話,提交到 資料庫中, 發現數據庫中的程式碼是

關於servletFilter過濾器解決頁面亂碼問題

標題 ##使用Filter過濾器解決頁面亂碼 servlet中的Filter過濾器是一個挺好的東西,說實話, 前段時間寫velocity的時候,輸出中文時頁面亂碼 兩種解決方法: 第一個,是在velocity的配置檔案寫好輸入輸出編碼格式, 第二個,就

Filter過濾器解決全站亂碼問題

/** * 解決全站亂碼問題,處理所有的請求 */ @WebFilter("/*") public class CharchaterFilter implements Filter { @Override public void init(F

javaweb開發中的中文亂碼問題,使用Filter過濾器解決

get請求和post請求時候的中文亂碼問題 1.當form表單中的請求為get請求的時候 例如獲取使用者名稱: String username = new String(username.getBytes("ISO-8859-1"),"UTF-8");

Java Web(二) Servlet中response、request亂碼問題解決

nco post ima 處理 height http api img tle       三月不減肥,五月徒傷悲,這就是我現在的狀態,哈哈~ 健身、博客堅持。                               --WH 一、request請求參數出現的亂碼問題 

使用Filter處理中文亂碼re

filter處理中文亂碼 在web中當頁面的編碼格式和服務器的編碼格式不一樣時,向服務器傳遞中文就會出現亂碼,那麽如何解決呢?這裏要分get請求和post請求,對於這兩種不同的請求有不同的處理處理方式,處理方式如下:1.post請求 post請求處理中文亂碼相對簡單,只需要在doPost()方法中設置

web開發(二) Servlet中response、request亂碼問題解決

相對 求和 AD 過程 中文亂碼 net new 規則 英文 在網上看見一篇不錯的文章,寫的詳細。 以下內容引用那篇博文。轉載於《http://www.cnblogs.com/whgk/p/6412475.html》,在此僅供學習參考之用。 一、request請求參數出

使用ie的filter解決rgba在IE8下沒有效果的問題

pro 執行 tty tran ie8 sco clas css tex 使用ie的filter來解決rgba在IE8下沒有效果的問題,css代碼如下: background: rgba(255,255,255,0.1); filter:progid:DXImageTr

Servlet – Listener、Filter、Decorator

ide info sha sys nstat blog rep etl 級別 Listener-監聽器Listener為在Java Web中進行事件驅動編程提供了一整套事件類和監聽器接口.Listener監聽的事件源分為ServletContext/HttpSession/

filter過濾器注入bean例項時注入失敗null

1、問題描述 SpringBoot中filter注入bean時注入失敗,bean一直為空。 @Slf4j @Component public class RestAuthFilter extends FormAuthenticationFilter { /

SpringBoot定義三大元件Servlet,過濾器Filter,監聽器Listener

SpringBoot定義三大元件Servlet,過濾器Filter,監聽器Listener 1.定義元件的配置類: com.example.mybatis2018.config.MyServletConfig package com.example.mybatis2018.config;

Java Web筆記 – Servlet中的Filter過濾器的介紹和使用 編寫過濾器

1、過濾器介紹: 在Servlet規範2.3中定義了過濾器,它能夠對Servlet容器的請求和響應物件進行檢查和修改。 Servlet過濾器本身並不生成請求和響應物件,只是提供過濾功能。 Servlet過濾器能夠在Servlet被呼叫之前檢查Request物件,並修改Request Header和R

javaWeb(十三)Demo:Filter實現自動登陸功能(Myeclipse+JSP+Servlet+EL/JSTL+Filter

Filter實現自動登陸功能 原始碼:source code 思路圖: 就是在伺服器和顯示介面之間新增一個過濾器(這裡過濾範圍其實是全域性),獲取cookie裡面的使用者名稱和密碼,然後直接在Filter裡面登陸(就不要去登陸頁面了) 登陸頁面主要是看你的sess

javascript在IE8下不支援filter解決方案

這是程式碼: songs = songs.filter(function (el) { return el.album==album; }); 這是錯誤: Object doesn't support this property or me

Filter過濾器處理亂碼問題

當我們從表單獲取資料時。 當獲取到的資料是中文時,那麼就可能會產生亂碼。 對於Post方式提交的資料,我們可以通過直接設定request和response的編碼方式來解決亂碼問題。 但是Get方式提交的資料,那麼就需要編碼再解碼的方式解決亂碼問題。 比如

servlet的過濾器filter

  <!--配置過濾器A  -->   <filter>     <filter-name>FilterA</filter-name>     <filter-class>com.zhiyou100.crm.filter.FilterA</f

解決docker容器中,日誌中文亂碼問題

1. 找到dockerfile檔案, 如 /use/local/src/docker/Dockerfile 2. 編輯Dockerfile 新增 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.

【暑假學習筆記】之——servlet,使用idea寫一個註冊介面並返回註冊成功(解決亂碼問題)的案例

話不多說,我們新建一個java web + tomcat專案,具體步驟可以參照我的另一篇: 在src目錄下新建web資料夾,在web資料夾下新建regServlet.java檔案。 在與src同級的web目錄下新建register.html檔案。 先來寫regi

Servlet下載中出現中文亂碼以及檔名不全的解決方法

出現這個問題的主要原因就是不同瀏覽器提供的解析編碼不同IE和谷歌用的是URL編碼,而火狐用的是Base64編碼解決問題的方法就是根據不同的瀏覽器設定響應的編碼// 先從request中獲取瀏覽器的資訊String agent = request.getHeader("User