前后台亂碼問題


前后台亂碼問題自己由於也看過相關博客介紹過解決方法,但是自己本地測試后亂碼發生的略有不同,故在此作出總結,並附上自己的環境

開發環境idea2019.3,tomcat8, windows7

使用chrome瀏覽器進行測試

1.前台向后台傳送中文字符的情況介紹:

前台代碼jsp文件

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 
 3 <form action="requestPost.do" method="post">
 4     用戶名:<input type="text" name="userName"/>
 5     <input type="submit" value="post方式提交表單">
 6 </form>
 7 
 8 <form action="requestGet.do" method="get">
 9     用戶名:<input type="text" name="userName"/>
10     <input type="submit" value="get方式提交表單">
11 </form>

后台代碼servlet

 1 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2 
 3         //獲取servletPath
 4         String servletPath = request.getServletPath();
 5         //去除路徑名后綴名中的.do
 6         String methodName = servletPath.substring(1, servletPath.length()-3);
 7         try {
 8             //利用反射獲取methodName對應的方法
 9             Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
10             //利用反射調用相應的方法
11             method.invoke(this, request, response);
12         } catch (Exception e) {
13             e.printStackTrace();
14             response.sendRedirect("error.jsp");
15         }
16     }
17 
18 
19     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
20         // TODO Auto-generated method stub
21         doGet(request, response);
22     }

 

 1 private void requestGet(HttpServletRequest request, HttpServletResponse response){
 2         System.out.println("requestGet");
 3 
 4         String userName = request.getParameter("userName");
 5         System.out.println("直接獲取用戶名: "+userName);
 6         try {
 7             request.setCharacterEncoding("UTF-8");
 8             userName = request.getParameter("userName");
 9             System.out.println("設置utf-8編碼: "+userName);
10 
11             userName = new String(userName.getBytes("ISO8859-1"), "utf-8");
12             System.out.println("先ISO8859-1接收數據,后轉UTF-8編碼: "+ userName);
13 
14 //            response.setHeader("content-type", "text/html; charset=UTF-8");
15 //            response.getWriter().write(userName);
16         } catch (IOException e) {
17             e.printStackTrace();
18         }
19 
20     }
21   

結果:

requestGet
直接獲取用戶名: 小紅
設置utf-8編碼: 小紅
先ISO8859-1接收數據,后轉UTF-8編碼: ??
 1  private void requestPost(HttpServletRequest request, HttpServletResponse response){
 2         System.out.println("requestPost");
 3         String userName = request.getParameter("userName");
 4         System.out.println("直接獲取用戶名: "+userName);
 5         try {
 6             request.setCharacterEncoding("UTF-8");
 7             userName = request.getParameter("userName");
 8             System.out.println("設置utf-8編碼: "+userName);
 9 
10             userName = new String(userName.getBytes("ISO8859-1"), "utf-8");
11             System.out.println("先ISO8859-1接收數據,后轉UTF-8編碼: "+ userName);
12 
13 //            response.setHeader("content-type", "text/html; charset=UTF-8");
14 //            response.getWriter().write(userName);
15         } catch (IOException e) {
16             e.printStackTrace();
17         }
18 
19     }

結果:

requestPost
直接獲取用戶名: ?°????
設置utf-8編碼: ?°????
先ISO8859-1接收數據,后轉UTF-8編碼: 小明

從以上結果可以看出,對於前台的get請求方式,后台不需要對其對任何操作,中文字符不會出現亂碼情況;

相反,對於post請求方式,后台需要將先使用先

ISO8859-1接收數據,后轉UTF-8編碼

才能保證中文不亂碼。

另外,如果在web.xml中設置字符編碼,則不管是post還是get皆不用做任何處理,下面的設置是防止前端輸入的數據到了后台發生亂碼現象。

 1   <filter>
 2         <filter-name>encoding-filter</filter-name>
 3         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
 4         <init-param>
 5             <param-name>encoding</param-name>
 6             <param-value>UTF-8</param-value>
 7         </init-param>
 8         <init-param>
 9             <param-name>forceEncoding</param-name>
10             <param-value>true</param-value>
11         </init-param>
12     </filter>
13     <filter-mapping>
14         <filter-name>encoding-filter</filter-name>
15         <url-pattern>*.do</url-pattern>
16     </filter-mapping>

 

2.后台向前台輸出帶有中文字符的亂碼現象:

前台代碼:

1 <a href="query.do">Query</a><br/>
2 <a href="delete.do">Delete</a><br/>
3 <a href="update.do">update</a><br/>

后台代碼servlet:

 1 private void update(HttpServletRequest request, HttpServletResponse response){
 2         System.out.println("update");
 3         try {
 4             /*
 5             * 當輸出數字時,需要將該數字轉換成字符串形式,然后轉化成字節數組進行輸出
 6             * 所以,當希望服務器輸出什么瀏覽器就能看到什么,那么服務器端都要以字符串
 7             * 的形式進行輸出
 8             * */
 9 
10             response.setHeader("content-type", "text/html; charset=UTF-8");
11             //response.getOutputStream().write(1);//前台顯示不出1
12             response.getOutputStream().write((1+"").getBytes("UTF-8"));
13         } catch (IOException e) {
14             e.printStackTrace();
15         }
16     }
17 
18     private void delete(HttpServletRequest request, HttpServletResponse response){
19         System.out.println("delete");
20         try {
21             /*
22              *使用outputStream輸出中文注意事項:
23              * 在服務端,數據以哪個碼表輸出,那么就要控制客戶端以相應的碼表打開,
24              * 比如response.getOutputStream().write("刪除操作".getBytes("UTF-8"));//使用
25              * outputStream流向客戶端瀏覽器輸出中文,以utf-8的編碼進行輸出
26              * 此時就要控制客戶端瀏覽器以utf-8的編碼打開,否則前台顯示時會出現中文亂碼
27              * 可通過設置響應頭控制瀏覽器的行為解決亂碼問題:
28              *  response.setHeader("content-type", "text/html; charset=UTF-8");
29              * 通過設置響應頭控制瀏覽器以utf-8的編碼顯示數據
30              * */
31             response.setHeader("content-type", "text/html; charset=UTF-8");
32             /*getbytes()是一個將字符轉換成字節數組的過程,這個過程一定會查找碼表,如果是
33             中文的操作系統環境,默認就是查找GB2312的碼表,將字符轉換成字節數組的過程就是將
34             中文轉換成GB2312的碼表上對應的數字,
35             比如:"中" 在GB2312的碼表上對應的數字是98
36             getbytes()如果不帶參數,那么就會根據操作系統的語言環境來選擇轉換碼表,如果是中文操作系統,
37             那么就使用GB2312的碼表
38             */
39             response.getOutputStream().write("刪除操作".getBytes("UTF-8"));
40         } catch (IOException e) {
41             e.printStackTrace();
42         }
43     }
44 
45     private void query(HttpServletRequest request, HttpServletResponse response){
46         System.out.println("query");
47         try {
48             /*
49             *  與outputStream相同
50             * 設置響應頭來控制瀏覽器以指定的字符編碼進行顯示
51             * response.setHeader("content-type", "text/html; charset=UTF-8");
52             * 它的等價寫法:
53             * response.getWriter().write("<meta http-equiv='content-type' content='text/html'; charset='UTF-8'/>");
54              * */
55             response.setHeader("content-type", "text/html; charset=UTF-8");
56              response.getWriter().write("查詢操作");
57         } catch (IOException e) {
58             e.printStackTrace();
59         }
60     }

后台向前台輸出中文時,不管是使用outputStream還是PrintWriter,只需要添加一句

response.setHeader("content-type", "text/html; charset=UTF-8");

就能夠解決亂碼問題,同時這里也順便介紹了如果向前台輸出數字時,需要將其轉換成字符串再輸出,否則會顯示不正常。

 

本文主要參考的孤傲蒼狼博客相關內容,但是自己親自在自己電腦上測試的情況和其中有點不一樣,具體差異原因不太清楚。




免責聲明!

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



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