Java EE get請求、Post請求中文亂碼解決

一、post請求中文亂碼解決

首先,通過一個直觀的程序展示我們的一個post請求亂碼的demo

我們建立一個 Java EE項目charset_test,在WebContent目錄建立一個html頁面charset_form.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">	<!-- 指定瀏覽器在顯示的時候默認使用utf-8編碼 -->
<title>Insert title here</title>
</head>
<body>
	<form action="/charset_test/charset/process" method="get">
		姓名:<input type="text" name="ename"><br>
		地址:<input type="text" name="eaddress"><br>
		<input type="submit" value="提交">
	</form>
</body>
</html>

在Java Resources/src目錄下建立servlet:CharsetServlet指定包com.servlet.charset

package com.servlet.charset;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/charset/process")
public class CharsetServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public CharsetServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String ename = request.getParameter("ename");
		String eaddress = request.getParameter("eaddress");
		System.out.println(ename + ":" + eaddress);
	}

}

啓動服務,我們在前臺form表單填寫中文,提交表單,查看後臺打印字符~。

 後臺打印結果:

 一堆亂碼,why?

首先,我先來說解決方法,我這有兩種方法,先說第一種:

在現有的CharsetServlet中,我將獲取到的ename及eaddress做以下處理,原因我直接在代碼中通過註釋寫出來。

String ename = request.getParameter("ename");
String eaddress = request.getParameter("eaddress");

//將ename字符串通過iso-8859-1編碼轉換爲字節數組,再通過utf-8編碼,將字節數組解碼形成新的字符串
/*
1、爲什麼是iso-8859-1?因爲這是tomcat默認的解碼方式,將瀏覽器傳遞過來的參數默認通過iso-8859-1來解碼。這裏通過ename.getBytes("iso-8859-1") 獲取到的字節數組就是最原始的從瀏覽器端傳遞過來的字節數組
2、將通過getBytes函數得到的新的字節數組,通過指定的UTF-8編碼解碼形成新的字符串。
    那這裏爲什麼是utf-8呢?這裏的話,就要看我們編寫的那個html頁面的一句代碼了:
    <meta charset="utf-8">
    這一句是告訴瀏覽器的編碼方式,瀏覽器將按照utf-8編碼來對我們的html頁面進行解析

    所以我們的post請求,就是將我們的請求體通過utf-8編碼傳遞到我們的後臺web服務器的(這裏我是這麼理解的,因爲如果我把chaset="utf-8"修改爲gbk-2312,那麼後臺的utf-8解碼參數也要修改爲gbk-2312,所以我個人認爲這中間是這麼轉換的,如果大家有什麼不同的意見,可以指正。)
3、通過指定解碼形成的字符串(這裏是utf-8),在Java中String又是怎麼保存的呢?在這裏我覺得我們的Java做了兩步轉換,一是將具體字節通過utf-8編碼進行解碼爲字符,再將這個字符編碼爲“系統編碼”
因爲這裏我也不是很確定這是否是系統編碼,不過肯定有一個這樣的編碼,我們就先這麼認爲~~以幫助我們理解。
*/
String utf8Ename = new String(ename.getBytes("iso-8859-1"),"UTF-8");
String utf8Eaddress = new String(eaddress.getBytes("iso-8859-1"),"UTF-8");
System.out.println(ename + ":" + eaddress);

對於上面的方法,可以解決我們的亂碼問題,不過,如果參數很多的情況下,我們仍然要這麼做嗎?豈不是顯得很麻煩?

這裏,我們可以在原來的代碼基礎上做這樣的修改:

//這樣設置之後,我們通過request獲取前臺post傳遞的參數值,默認就採用utf-8進行解碼操作了。
request.setCharacterEncoding("UTF-8");

String ename = request.getParameter("ename");
String eaddress = request.getParameter("eaddress");

System.out.println(ename + ":" + eaddress);

注意:request.setCharacterEncoding("UTF-8");必須在post程序處理使用request獲取參數之前使用,且只對於post請求傳遞的參數起作用,get方式是無效的。 

 

二、get請求中文亂碼解決

編碼解碼的原理上面已經說了,這裏直接寫怎麼操作吧。

1、編輯打開tomcat的配置文件server.xml:D:\download\java\apache-tomcat-8.5.43\conf\server.xml

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

修改爲

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

即可。

tips:對於Tomcat8.x以後版本,默認get請求發送中文,默認就是通過utf-8的格式進行解碼,因此無需顯示指定轉換方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章