javaweb后台接收中文亂碼。


 

 

 

加一個編碼過濾器。

 

package cn.itcast.goods.filter;


import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Map.Entry;

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;
import javax.servlet.http.HttpServletResponse;
/**
 * 處理整個web應用全站亂碼
 * 1)處理請求參數亂碼
 * 2)處理響應正文亂碼
 * @author RoySun
 *
 */
public class MixCodeFilter implements Filter{
    @Override
    public void destroy() {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        //針對post提交方式,這一句即可處理接收請求中的亂碼
        request.setCharacterEncoding("utf-8");
        /*
         *過濾器中處理響應正文亂碼,
         *所有攔截到的資源的亂碼問題都可以解決
         */
        response.setContentType("text/html;charset=utf-8");
        /*
         * 采用裝飾者模式,將request對象進行包裝,
         * 在裝飾類中重寫getParameter等獲取參數的方法
         */
        MyHttpServletRequest myRequest = new MyHttpServletRequest(req);
        chain.doFilter(request, res);
    }

    @Override
    public void init(FilterConfig onfig) throws ServletException {}

}
//裝飾類,對HttpServletRequest類進行裝飾,重寫獲取請求參數的方法
class MyHttpServletRequest extends HttpServletRequestWrapper{
    private HttpServletRequest request;
    //構造方法
    public MyHttpServletRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }
    @Override
    public String getParameter(String name) {
        return this.getParameterValues(name)==null? null:this.getParameterValues(name)[0];
    }

    @Override
    public String[] getParameterValues(String name) {
        return this.getParameterMap().get(name);
    }
    private boolean isEncode=true;
    @Override
    public Map<String, String[]> getParameterMap() {
        if("GET".equalsIgnoreCase(request.getMethod())){//針對get提交方式進行手動編解碼
            Map<String, String[]> map = request.getParameterMap();
            if(isEncode){
                for (Entry<String, String[]> entry : map.entrySet()) {
                    String[] params = entry.getValue();
                    for(int i=0;i<params.length;i++){
                        try {
                            System.out.println("過濾器之前的參數:" + params[i]);
                            params[i]=new String(params[i].getBytes("iso8859-1"), "utf-8");
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                    }
                }
                isEncode = false;
            }
            return map;
        }else{//其余6種提交方式
            return request.getParameterMap();
        }
    }

}

 

 

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>cn.itcast.goods.filter.MixCodeFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM