1. 程式人生 > >使用Filter處理中文亂碼re

使用Filter處理中文亂碼re

filter處理中文亂碼

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


1.post請求

post請求處理中文亂碼相對簡單,只需要在doPost()方法中設置請求的編碼格式就行了,因為post請求的參數在請求體中。處理方式如下:

protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { request.setCharacterEncoding("utf-8");

response.setContentType("txt/html;charset=utf-8")

......

}

2.get請求

get請求不能像上面post那樣來處理中文亂碼問題,因為get請求的參數url地址欄中,那麽此時就要使用getBytes(String s)方法對接收到的參數進行反編碼,得到服務器編碼的字節碼,再調用new String(byte[] bytes,String s)獲得編碼後的字符串。處理方法如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String name = request.getParameter("username");

byte[] bytes = name.getBytes("ISO-8859-1");

String value = new String(bytes,"utf-8");

......

}


說完了get請求和post請求兩種請求處理中文亂碼的方法,那麽接下來說下如何把這兩種處理方法引入到Filter中。我們不可能為每個請求都對其做中文亂碼處理,那樣會出現太多的代碼冗余,此時就可以用過濾器來做,先讓每個請求達到Servlet之前,先被過濾器攔截,等過濾器處理完之後再調用其chain.doFilter(request,response)方法對此請求放行,那麽此時到達Servlet的每個請求都被處理過了,就不用考慮中文亂碼問題了。對於get請求怎樣拿到每次請求的參數名呢?這裏需要重寫request的getParameters(String name)方法,處理方法如下:


    public class MyRealRequest extends HttpServletRequestWrapper {    
        private HttpServletRequest request;
        public MyRealRequest(HttpServletRequest req) {
            super(req);
            request = req;
        }
        @Override
        public String getParameter(String name) {
            String value = request.getParameter(name);
            try {
        byte[] bytes = value.getBytes("ISO-8859-1");
        value = new String(bytes,"utf-8");
            } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
            }
            return value;
        }
    }


有了這個類,我們就可以用它來處理get請求的中文亂碼問題,在Filter中處理方法如下:


public class CharacterFilter implements Filter {
    public void init(FilterConfig fConfig) throws ServletException {}
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        String method = req.getMethod(); 
        if(method.equals("POST")){
            req.setCharacterEncoding("utf-8");
            res.setContentType("text/html;charset=utf-8");
            chain.doFilter(req, res);
        }else if(method.equals("GET")){
            MyRealRequest realRequest = new MyRealRequest(req);
            res.setContentType("text/html;charset=utf-8");
            chain.doFilter(realRequest, res);
        }
    }
    public void destroy() {}
}


通過以上的處理中文亂碼的問題就解決了,那麽接下就需要配置Filter,使它對每個請求都運用這個操作。配置方法如下:

<filter>

<filter-name>CharacterFilter</filter-name>

<filter-class>com.web.filter.CharacterFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>CharacterFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>


到此,使用Filter處理中文亂碼的問題就說完了。











使用Filter處理中文亂碼re