1. 程式人生 > >J2EE中get方式和post請求方式亂碼的解決辦法

J2EE中get方式和post請求方式亂碼的解決辦法

J2EE中中文亂碼的問題
J2EE中中文亂碼的問題主要就是出現在瀏覽器給伺服器提交引數資料的時候出現的。而瀏覽器與伺服器傳遞資料的方式有兩種
①post提交方式,因為post提交方式都是把請求引數放在請求體(請求行,請求訊息頭,請求內容)裡面的。
在伺服器端伺服器會將客戶端提交的請求資料都放到HttpServletRequest例項當中,但可以通過HttpServletRequest
例項物件的setCharacterEncoding(“編碼集”)方法來給請求引數設定合適的解碼集,那樣就會防止亂碼的情況了。

java程式碼例項如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/J2EE_Codeing_Test/LoginServlet" method="post"
> 使用者名稱:<input type="text" name="username"/> 密碼:<input type="password" name="password"/> <input type="submit" value="登陸"/> </form> </body> </html>
Servlet接收引數做設定即可
package com.yd.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public LoginServlet() {
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//post方式來獲得正確格式的引數防止亂碼
		request.setCharacterEncoding("utf-8");
		String name=request.getParameter("username");
		//System.out.println(name);
		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		PrintWriter out=response.getWriter();
		out.println("form"+name);
	}

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

}

②get提交方式
對於get方式的請求引數是附加在url地址的後面的,而不是放在請求體中的所以用HttpServletRequest例項物件的
setCharacterEncoding()方法設定編碼集是沒有效果的。而且伺服器對於客戶端提交的url預設使用iso-8859-1的編碼方式
對其進行編碼,也就是說get請求方式的資料引數都是通過伺服器預設的iso-8859-1進行編碼的。所以對其編碼就要使用特殊的
解碼方式來完成。
java程式碼例項如下登陸還是用的上面的Login.jsp頁面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/J2EE_Codeing_Test/LoginServlet" method="get
"> 使用者名稱:<input type="text" name="username"/> 密碼:<input type="password" name="password"/> <input type="submit" value="登陸"/> </form> </body> </html>
在servlet類中要解碼後重新設定其編碼集即可
package com.yd.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public LoginServlet() {
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//通過get方式傳遞的引數資料
		String name=request.getParameter("username");
		//因為伺服器預設對url進行iso-8859-1進行編碼了 
		//先通過iso-8859-1的方式對字串解碼成位元組陣列     然後在給字串設定要使用的編碼集
		name=new String(name.getBytes("iso-8859-1"),"utf-8");
		response.setContentType("text/html;charset=utf-8");
		response.setCharacterEncoding("utf-8");
		PrintWriter out=response.getWriter();
		out.println("form"+name);
	}

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

}
③當然因為我們的Tomcat伺服器預設是使用iso-8859-1的編碼方式來對客戶端通過get方式提交的資料進行編碼,那麼我們如何讓
每一次伺服器給我們通過get方式提交的資料用我們想要它使用的編碼集來對資料進行編碼呢?

很簡單隻需要我們在伺服器的配置檔案server.xml中配置
<Connector URIEncoding="utf-8" connectionTimeout="20000" maxThreads="150" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
這樣伺服器在接收到客戶端通過get方式提交的引數時就會使用utf-8物件進行編碼,當獲取引數時也會使用utf-8來進行解碼,這樣
就不會造成亂碼了。