Servlet過濾器實現(xiàn)統(tǒng)一編碼

在開發(fā) Web 項目時,解決中文亂碼問題是不可避免的。在前面所學的知識中,解決亂碼的通常做法是在 Servlet 程序中設置編碼方式,但是,當多個 Servlet 程序都需要設置編碼方式時,就會書寫大量重復的代碼。

為了解決這一問題,我們可以在 Filter 中對獲取到的請求和響應消息進行編碼處理,這樣就可以實現(xiàn)全站編碼方式的統(tǒng)一。本節(jié)將分步驟演示如何使用 Filter 實現(xiàn)全站編碼的統(tǒng)一。

創(chuàng)建過濾器

創(chuàng)建一個名稱為 CharacterFilter 的 Filter 類,該類用于攔截用戶的請求訪問,并實現(xiàn)全站編碼的統(tǒng)一,其具體實現(xiàn)代碼如下所示:

public class CharacterFilter implements Filter {
    public void init(FilterConfig fConfig) throws ServletException {
    }

    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        // 攔截所有的請求,解決全站中文亂碼,指定request和response的編碼
        request.setCharacterEncoding("utf-8"); // 只對消息體有效
        response.setContentType("text/html;charset=utf-8");
        chain.doFilter(request, response);
    }

    public void destroy() {
    }
}

修改配置文件web.xml

在 CharacterFilter 中,針對請求的方式不同,采用了不同的亂碼解決方式。其中,由于 POST 方式的請求參數(shù)存放在消息體中,所以通過 setCharacterEncoding() 方法進行設置,而 GET 方式的請求參數(shù)存放在消息頭中,通過 HttpServletRequestWrapper 類對 HttpServletRequest 類進行包裝,并通過重寫 getParameter() 的方式設置 GET 方式提交參數(shù)的編碼。

需要注意的是,由于要攔截用戶訪問資源的所有請求,因此需要將 CharacterFilter 映射信息中 <filter-mapping> 元素攔截的路徑設置為“/*”,如下所示:

<filter>
    <filter-name>CharacterFilter</filter-name>
    <filter-class>com.example.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容