880
技術社區[雲棲]
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-02 22:15:49
上一篇:
go language --- techory diary 15 Dec
下一篇:
Android ListView 按鈕點擊分頁顯示
百度地圖之標注聚會
HTAP數據庫(OLTP+OLAP) - 數據庫典型架構 優缺點剖析(shard VS shared)
Java中long類型容易出現的bug
HowTo Install Redmine in Ubuntu - Redmine
Dissecting the Disruptor: How do I read from the ring buffer?
PostgreSQL 邏輯訂閱 - 給業務架構帶來了什麼希望?
ld: warning: cannot find entry symbol _start; defaulting to 00000000080481d8
《企業級ios應用開發實戰》一2.6 在模擬器上運行應用程序
spring框架——Spring 框架簡介
【轉載】跟我一起寫 Makefile