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解決亂碼問題例項)
這一切還要從亂碼講起....場景: 是這樣子的,在做使用者新增和修改模組的時候,做完了之後,在填寫使用者名稱的時候,如果我們輸入中文的話,提交到 資料庫中, 發現數據庫中的程式碼是
關於servlet中Filter過濾器解決頁面亂碼問題
標題 ##使用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