1. 程式人生 > >Filter過濾器處理亂碼問題

Filter過濾器處理亂碼問題

當我們從表單獲取資料時。
當獲取到的資料是中文時,那麼就可能會產生亂碼。

對於Post方式提交的資料,我們可以通過直接設定request和response的編碼方式來解決亂碼問題。

但是Get方式提交的資料,那麼就需要編碼再解碼的方式解決亂碼問題。

比如下面這個程式碼,我們獲取到jsp頁面提交的資料。
中文的資料就產生了亂碼。

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String
name = request.getParameter("username"); String like = request.getParameterValues("like")[0]; System.out.println(name); System.out.println(like); }

我們直接在Servlet裡解決的話,受用範圍比較小,也麻煩。
那麼我們就想了,直接在Filter裡將獲取到的資料處理後再發送給Servlet。

下面看Filter裡我們怎樣實現的。

package com.qianfeng.filter;

import
java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import
javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class EncodeFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //處理post方式的亂碼 //request.setCharacterEncoding("utf-8"); HttpServletRequest req = (HttpServletRequest) request; MyRequest myReq = new MyRequest(req); chain.doFilter(myReq, response); } public void destroy() { } } class MyRequest extends HttpServletRequestWrapper { ServletRequest r; private HttpServletRequest req; MyRequest(HttpServletRequest req) { super(req); this.req = req; } // @Override // public String getParameter(String name) { // String value = req.getParameter(name); // try { // return new String(value.getBytes("ISO8859-1"),"utf-8"); // } catch (UnsupportedEncodingException e) { // e.printStackTrace(); // } // return null; // } @Override public String getParameter(String name) { Map<String,String[]> map = getParameterMap(); return map.get(name)[0]; } @Override public String[] getParameterValues(String name) { Map<String,String[]> map = getParameterMap(); return map.get(name); } boolean flag = true; @Override public Map<String,String[]> getParameterMap() { Map<String,String[]> map = req.getParameterMap(); if(flag){ for(Map.Entry<String, String[]> en:map.entrySet()){ String[] arr = en.getValue(); System.out.println(en.getValue()); System.out.println(arr); for(int i=0;i<arr.length;i++){ //陣列中的每個值都要再編碼再解碼處理 try { arr[i] = new String(arr[i].getBytes("ISO8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } flag = false; } return map; } }

我們來doFilter裡獲取到Request物件。
而我們需要在呼叫getParameter和getParameterValues時就解決亂碼問題。

所以,我們需要實現自己的方法,利用裝飾設計模式,實現MyRequest類。

程式碼就不拆開分析了,直接去上面找。

實現getParameter和getParameterValues方法,然後在方法裡呼叫getParameterMap方法,對提交的資料進行編碼再解碼。

這幾需要注意的地方,我們獲取到的陣列改變的值直接修改的map中的值,因此最好我們直接返回map就可以了。
String[] arr = en.getValue();