您好,登錄后才能下訂單哦!
在web中當頁面的編碼格式和服務器的編碼格式不一樣時,向服務器傳遞中文就會出現亂碼,那么如何解決呢?這里要分get請求和post請求,對于這兩種不同的請求有不同的處理處理方式,處理方式如下:
1.post請求
post請求處理中文亂碼相對簡單,只需要在doPost()方法中設置請求的編碼格式就行了,因為post請求的參數在請求體中。處理方式如下:
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請求的參數url地址欄中,那么此時就要使用getBytes(String s)方法對接收到的參數進行反編碼,得到服務器編碼的字節碼,再調用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中。我們不可能為每個請求都對其做中文亂碼處理,那樣會出現太多的代碼冗余,此時就可以用過濾器來做,先讓每個請求達到Servlet之前,先被過濾器攔截,等過濾器處理完之后再調用其chain.doFilter(request,response)方法對此請求放行,那么此時到達Servlet的每個請求都被處理過了,就不用考慮中文亂碼問題了。對于get請求怎樣拿到每次請求的參數名呢?這里需要重寫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>
<filter-name>CharacterFilter</filter-name>
<filter-class>com.web.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
到此,使用Filter處理中文亂碼的問題就說完了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。