javaweb回顧第十一篇過濾器(附實現中文亂碼問題)

来源:http://www.cnblogs.com/LipeiNet/archive/2016/08/18/5778276.html
-Advertisement-
Play Games

1:過濾器概念 過濾器就是一種在請求目標資源的中間組件,比喻把污水轉換成純凈水中間需要一個污水凈化設備,那麼這個設備就好比一個過濾器。那麼我用圖來表示過濾器(可以有多個過濾器)運行的過程 2:Filter(過濾器)介面 Filter介面包含三個方法分別是init、doFilter、 destroy下 ...


 1:過濾器概念

過濾器就是一種在請求目標資源的中間組件,比喻把污水轉換成純凈水中間需要一個污水凈化設備,那麼這個設備就好比一個過濾器。那麼我用圖來表示過濾器(可以有多個過濾器)運行的過程

2:Filter(過濾器)介面

Filter介面包含三個方法分別是init、doFilter、 destroy下麵先逐個介紹。

2.1:public void init(FilterConfig filterConfig)

這個方法主要來完成初始化過濾器,容器調用這個方法的時候,向過濾器傳遞FilterConfig對象,FilterConfig的用法和ServletConfig相似,利用FilterConfig對象可以得到ServletContext對象,以及可以得到部署描述符中過濾器初始化的參數。

2.2:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

該方法和Servlet中的service相似,當客戶端請求目標資源的時候,容器就會調用與這個目標資源相關聯的過濾器的doFilter方法,在這個方法中可以對請求和響應進行處理,實現過濾器的特定功能,在處理完成之後調用chain.doFilter把請求傳給下一個過濾器(目標資源)

2.3:public void destroy()

當過濾器生命結束的時候,容器就會調用該方法來釋放過濾器的資源

3:過濾器的配置

過濾器是通過<filter>和<filter-mapping>元素來完成的。

3.1:<filter>元素

<filter>元素的屬性,<filter-name>來為過濾器指定一個名字,<filter-class>元素用於指定過濾器完整的限定類名,<init-param>用來為過濾器指定初始化參數,他下麵有2個屬性,一個是<param-name>參數名稱,另一個是<param-value>參數值。

3.2:<filter-mapping>元素

<filter-mapping>下麵有3個主要的屬性,<filter-name>用來指定過濾已經在容器聲明的過濾器名稱,<url-pattren>和<servlet-name>這兩個任選其中一個,<url-pattren>表示當請求這樣的url時候過濾器被調用,<servlet-name>表示當這個Servlet被調用時候過濾器被調用(可以有多個Servlet)。

基本知識準備完畢了,現在我們一起開始進行實踐。

4:過濾器時間應用

4.1:過濾器解決中文亂碼問題

由於Web容器預設的編碼方式是ISO-8859-1,在Servlet/Jsp程式中,通過請求的對象的getParameter()方法得到的字元串是以ISO-8859-1轉換而來(有人說我在jsp程式已經設置了UTF-8為什麼還出現這種情況呢,那是由於web容器再次對請求的數據進行一次轉換,所以後來得到字元串就是ISO-8859-1編碼的),這就是導致亂碼的原因。如下圖

那麼找到根源以後問題就比較好解決了,核心代碼如下

public class EncodingFilter implements Filter {

    protected String encoding=null; 
    class myRequestWrapper extends HttpServletRequestWrapper{

        public myRequestWrapper(HttpServletRequest request) {
            super(request);
        }
        public String getParameter(String param)
        {
            String value=null;
            try{
                //post提交
                super.setCharacterEncoding(encoding);
                value=super.getParameter(param);
                if(super.getMethod().equalsIgnoreCase("GET"))//get提交
                {
                    if(value!=null)
                    {
                        value=new String(value.getBytes("iso8859-1"), encoding);
                    }
                }        
            }
            catch(UnsupportedEncodingException e){
                e.printStackTrace();
            }        
            return value;
        }
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        this.encoding=filterConfig.getInitParameter("encoding");//從web容器來獲取過濾器初始化參數
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //避免響應出現亂碼情況
        response.setCharacterEncoding("text/html;charset="+this.encoding);
        //把過濾器給下一個過濾器或者資源處理器
        chain.doFilter(new myRequestWrapper((HttpServletRequest)request), response);
    }

    public void destroy() {
        this.encoding=null;
    }
}

對過濾器進行配置

<filter>
        <filter-name>encoding</filter-name>
        <filter-class>com.lp.filters.EncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <servlet-name>LoginServlet</servlet-name>
        <!-- <url-pattern>/LoginServlet</url-pattern> -->
    </filter-mapping>

ok上面的過濾器就完成了,大家自行測試。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • WPF設計界面過程中,有時需要設計一種可以手動滑動修改並實時顯示的進度條 進度條,效果如下: 顏色、圖標、節點什麼的,都可以重新替換。 前端XMAL代碼: <UserControl x:Class="WpfApplication4.ProgressBarControl" xmlns="http:// ...
  • myeclipse中使用maven插件的時候,運行run as maven build的時候報錯 Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and ...
  • 一、必備插件 1. babel:es6語法支持,需要babel-perset-es2015(轉換成es5執行)、babel、babel-core(程式執行) 2. commander:自定義命令插件,提供參數的傳遞等 3. liftoff:實現對命令視窗的輸入監聽,以及命令格式化規格。 4. min... ...
  • 直接貼代碼吧,很簡單的代碼 自我感覺效率很低,多線程先不談,每次調用socket.create_connection((ip,port),2)都會創建一個對象,這很影響效率。 ...
  • 首先需要下載jdk: 由於oracle上的下載頁面有跳轉,直接用wget下載下來的只是html頁面。可以用下麵的命令: wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle ...
  • 本節內容和前節事件管理封裝是息息相關的,本節內容主要包含的代碼在connection{.h, .cc}中。 這裡面最主要的有兩個類:connection類和tcpsconn類,connetion類主要服務於單個套接字,包括套接字上的數據讀取寫入等,而tcpsconn類則是服務於套接字集合,如接收連接 ...
  • 已知有n個單位的水,問有幾種方式把這些水喝完,每天至少喝1個單位的水,而且每天喝的水的單位為整數。看上去挺複雜要跑迴圈,但其實上,列舉幾種情況之後就會發現是找規律的題了= =都是2的n-1次方,而且這題輸出二進位數就行了......那就更簡單了,直接輸出1,然後後面跟n-1個0就行了╮(╯_╰)╭ ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...