請求亂碼、響應亂碼的解決方案


請求亂碼

客戶端發送請求常用方式是GET、POST

GET請求

  1. 使用代碼轉換的方式
  2. 修改tomcat配置文件server.xml的方式

代碼轉換

url

http://localhost:8080/HelloServlet/h5?username=王學武

servlet類

 1 public class HelloServlet5 extends HttpServlet {
 2 
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         String username = req.getParameter("username");
 6         //get請求過來的數據,在url地址欄上就已經經過編碼了,所以我們取到的就是亂碼
 7         System.out.println("username===" + username);
 8         
 9         //tomcat收到了這批數據,getParameter 默認使用ISO-8859-1去解碼
10         //先讓文字回到ISO-8859-1對應的字節數組 , 然后再按utf-8組拼字符串
11         username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
12         System.out.println("username===" + username);
13     }
14 
15 }

console輸出

username===王学武
username===王學武 

修改tomcat配置文件

直接在tomcat里面做配置,在tomcat里面做設置處理 conf/server.xml 加上URIEncoding="utf-8",以后get請求過來的數據永遠都是用UTF-8編碼

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>

servlet類

1 public class HelloServlet5 extends HttpServlet {
2     @Override
3     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
4         String username = req.getParameter("username");
5         System.out.println("username===" + username);
6     }
7 }

console輸出

username===王學武

POST請求

設置請求體里面的文字編碼

request.setCharacterEncoding("UTF-8");

servlet類

 1 public class HelloServlet5 extends HttpServlet {
 2 
 3     @Override
 4     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         req.setCharacterEncoding("utf-8");
 6         String name = req.getParameter("username");
 7         System.out.println("設置請求體編碼后:name==="+name);
 8     }
 9     
10 }

console輸出

設置請求體編碼后:name===王五

如果在獲取參數后設置req.setCharacterEncoding("utf-8");就不會起作用

 1 public class HelloServlet5 extends HttpServlet {
 2 
 3     @Override
 4     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         String name = req.getParameter("username");
 6         System.out.println("設置請求體編碼前:name==="+name);
 7         System.out.println("-------------------------");
 8         
 9         req.setCharacterEncoding("utf-8");
10         name = req.getParameter("username");
11         System.out.println("設置請求體編碼后:name==="+name);
12     }
13     
14 }

console輸出

設置請求體編碼前:name===王五
-------------------------
設置請求體編碼后:name===王äº 

對GET方式不起作用

 url

http://localhost:8080/HelloServlet/h5?name=王學武

servlet類

 1 public class HelloServlet5 extends HttpServlet {
 2 
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         req.setCharacterEncoding("utf-8");
 6         String name = req.getParameter("name");
 7         System.out.println("name==="+name);
 8     }
 9     
10 }

console輸出

name===王学武 

響應亂碼

響應輸出有兩種方式

  1. 字符流
  2. 字節流

 

 1 public class HelloServlet5 extends HttpServlet {
 2 
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         //以字符流的方式寫數據
 6 //        resp.getWriter().write("<h3>response...</h3><br/>");
 7 //        resp.getWriter().write("<h3>response...</h3>");
 8 //        resp.getWriter().flush();
 9         //以字節流的方式寫數據
10         resp.getOutputStream().write("response...".getBytes());
11     }
12     
13 }

注:getWriter(),outPutStream在進行文件寫入操作只能用一個,否則會拋出java.lang.IllegalStateException: getWriter() has already been called for this response

 字符流輸出亂碼

 1 public class HelloServlet5 extends HttpServlet {
 2 
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         //以字符流的方式寫數據
 6         PrintWriter out = resp.getWriter();
 7         //out.write("<h3>響應輸出數據</h3><br/>");
 8         
 9         //1. 指定輸出到客戶端的時候,這些文字使用UTF-8編碼
10         resp.setCharacterEncoding("UTF-8");
11         //2. 直接規定瀏覽器看這份數據的時候,使用什么編碼來看。
12         resp.setHeader("Content-Type", "text/html; charset=UTF-8");
13         
14         out.write("<h3>響應輸出數據</h3>");
15     }
16     
17 }

 

原因:必須在resp.getWriter()之前設置字符編碼操作

 1 public class HelloServlet5 extends HttpServlet {
 2 
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         
 6         //1. 指定輸出到客戶端的時候,這些文字使用UTF-8編碼
 7         resp.setCharacterEncoding("UTF-8");
 8         //2. 直接規定瀏覽器看這份數據的時候,使用什么編碼來看。
 9         resp.setHeader("Content-Type", "text/html; charset=UTF-8");
10         
11         //以字符流的方式寫數據
12         PrintWriter out = resp.getWriter();
13         out.write("<h3>響應輸出數據</h3>");
14     }
15     
16 }

 

 修改servlet類的代碼

 1 public class HelloServlet5 extends HttpServlet {
 2 
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 5         
 6         //1. 指定輸出到客戶端的時候,這些文字使用UTF-8編碼
 7         resp.setCharacterEncoding("UTF-8");
 8         //2. 直接規定瀏覽器看這份數據的時候,使用什么編碼來看。
 9         resp.setHeader("Content-Type", "text/html; charset=UTF-8");
10         
11         //以字符流的方式寫數據
12         PrintWriter out = resp.getWriter();
13         out.write("<h3>響應輸出數據</h3>");
14     }
15     
16 }

字節流輸出

 1 public class HelloServlet5 extends HttpServlet {
 2     @Override
 3     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 4         //1. 指定瀏覽器看這份數據使用的碼表
 5         resp.setHeader("Content-Type", "text/html;charset=UTF-8");
 6         
 7         //2. 指定輸出的中文用的碼表
 8         resp.getOutputStream().write("響應輸出數據".getBytes("UTF-8"));
 9     }
10 }

其實,無論是字節流輸出還是字符流輸出,通用寫法:

  1. response.setContentType("text/html;charset=UTF-8")
  2. 寫輸出數據即可

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM