JavaWeb項目的中文亂碼的原因以及Servlet中處理GET請求和POST請求編碼過濾器
一、亂碼原因
①傳輸方和接收方采用的編碼不一致。傳輸方對參數采用的是UTF-8編碼而接收方卻用GBK進行解析,當然是亂碼。
②Tomcat服務器默認采用的ISO8859-1編碼得到參數值。雖然①中采用了同樣的編碼方式,但經過tomcat一處理,也會出現亂碼(GET方式)
二、解決辦法
方法一 每次傳輸都手動設置編碼(GET方式傳輸數據)
傳輸方
String name = URLEncoder.encode("張三","UTF-8");
String path = "https://localhost:8008/xyWeb/xyServlet?name=" + name;
接收方
String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
若傳輸方默認采用UTF-8編碼就沒有必要每次寫,但接收方每次都寫太煩,可考慮過濾器。
方法二(過濾器)
/** * 編碼過濾器 * * @author xy * */ public class EncodingFilter implements Filter { private String encoding; public void init(FilterConfig fConfig) throws ServletException { encoding = fConfig.getInitParameter("encoding"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws Exception { HttpServletRequest httprequest = (HttpServletRequest) request; if ("GET".equals(httprequest.getMethod())) { // 將httpRequest進行包裝 EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(httprequest, encoding); chain.doFilter(wrapper, response); } else { request.setCharacterEncoding(encoding); response.setContentType("text/html;charset=" + encoding); chain.doFilter(request, response); } } public void destroy() { } } /** * httpRequest進行包裝類 * * @author xy * */ public class EncodingHttpServletRequest extends HttpServletRequestWrapper { private HttpServletRequest request; private String encoding; public EncodingHttpServletRequest(HttpServletRequest request) { super(request); this.request = request; } public EncodingHttpServletRequest(HttpServletRequest request,String encoding) { super(request); this.request = request; this.encoding = encoding; } @Override public String getParameter(String name) { String value = request.getParameter(name); if (null != value) { try { // tomcat默認以ISO8859-1處理GET傳來的參數。把tomcat上的值用ISO8859-1獲取字節流,再轉換成UTF-8字符串 value = new String(value.getBytes("ISO8859-1"), encoding); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return value; } }
<filter> <display-name>EncodingFilter</display-name> <filter-name>EncodingFilter</filter-name> <filter-class>cn.xy.filter.EncodingFilter</filter-class> <init-param> <description></description> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
最後更新:2017-04-03 16:49:24