java高級架構師全套vip教學視頻,需要的加我qq1324981084
在實際的項目中我們會遇見中文亂碼的問題,這個問題是很惡心的事,所以我在這里提供了一些解決中文亂碼的方法,希望能給大家一些幫助。
一、單獨參數亂碼
post請求:request.setCharacterEncoding("utf-8");
當客戶端通過GET請求發送數據給服務器時,使用request.getParameter()獲取的數據是被服務器誤認為ISO-8859-1編碼的,也就是說客戶端發送過來的數據無論是UTF-8還是GBK,服務器都認為是ISO-8859-1,這就說明我們需要在使用request.getParameter()獲取數據后,再轉發成正確的編碼。例如客戶端以UTF-8發送的數據,使用如下轉碼方式:
get請求:String name = "獲取參數內容";
name = new String(name.getBytes("iso-8859-1"),"utf-8");
二、整個項目亂碼
那么對於整個項目怎么統一解決亂碼問題呢?這里我們利用攔截器和裝飾的方法解決這個問題
我們利用裝飾者模式將HttpServletRequest中的getParameter方法進行重新封裝,加入處理亂碼問題的方法。
/** * 裝飾reqeust * @author cxf * */ public class EncodingRequest extends HttpServletRequestWrapper { private HttpServletRequest req; public EncodingRequest(HttpServletRequest request) { super(request); this.req = request; } public String getParameter(String name) { String value = req.getParameter(name); // 處理編碼問題 try { value = new String(value.getBytes("iso-8859-1"), "utf-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } return value; }
public class EncodingFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 處理post請求編碼問題 request.setCharacterEncoding("utf-8"); HttpServletRequest req = (HttpServletRequest) request; /* * 處理GET請求的編碼問題 */ // String username = request.getParameter("username"); // username = new String(username.getBytes("ISO-8859-1"), "UTF-8"); /* * 調包request * 1. 寫一個request的裝飾類 * 2. 在放行時,使用我們自己的request */ if(req.getMethod().equals("GET")) { EncodingRequest er = new EncodingRequest(req); chain.doFilter(er, response); } else if(req.getMethod().equals("POST")) { chain.doFilter(request, response); } } public void init(FilterConfig fConfig) throws ServletException { }
web.xml配置
<filter> <display-name>EncodingFilter</display-name> <filter-name>EncodingFilter</filter-name> <filter-class>cn.itcast.web.filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
這樣post和get亂碼的問題也就解決了。
三、簡單方法
如果覺得上面的方式太繁瑣,也可以通過修改 tomcat 的 server.xml 配置文件:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
改成
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>
注: 如果是ajax發起的get請求中文依然會亂碼,這時候需要把 useBodyEncodingForURI="true" 改為 URIEncoding="UTF-8" 。
推薦參考文章 :https://www.cnblogs.com/binye-typing/p/6281627.html