新聞中心
在web中當(dāng)頁面的編碼格式和服務(wù)器的編碼格式不一樣時,向服務(wù)器傳遞中文就會出現(xiàn)亂碼,那么如何解決呢?這里要分get請求和post請求,對于這兩種不同的請求有不同的處理處理方式,處理方式如下:
1.post請求
post請求處理中文亂碼相對簡單,只需要在doPost()方法中設(shè)置請求的編碼格式就行了,因為post請求的參數(shù)在請求體中。處理方式如下:
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請求的參數(shù)url地址欄中,那么此時就要使用getBytes(String s)方法對接收到的參數(shù)進行反編碼,得到服務(wù)器編碼的字節(jié)碼,再調(diào)用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中。我們不可能為每個請求都對其做中文亂碼處理,那樣會出現(xiàn)太多的代碼冗余,此時就可以用過濾器來做,先讓每個請求達到Servlet之前,先被過濾器攔截,等過濾器處理完之后再調(diào)用其chain.doFilter(request,response)方法對此請求放行,那么此時到達Servlet的每個請求都被處理過了,就不用考慮中文亂碼問題了。對于get請求怎樣拿到每次請求的參數(shù)名呢?這里需要重寫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處理中文亂碼的問題就說完了。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。
分享名稱:使用Filter處理中文亂碼re-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://www.ef60e0e.cn/article/echop.html