1. 程式人生 > >關於HttpClient4.3.*的Post和Get提交亂碼問題

關於HttpClient4.3.*的Post和Get提交亂碼問題

無語了都,整了好久,網上各種答案,幾乎都是不行的,在apache的官網和一件網友的資料,現在OK了,分享如下:

這個原因是伺服器導致的,伺服器比如tomcat接收get方法預設使用的是ISO-8859-1編碼,而瀏覽器傳送時文字編碼是和頁面編碼保持一致的,如果頁面是使用utf-8 編碼 get方法文字自然是使用utf-8編碼,但接收伺服器沒有設定的情況下用了ISO-8859-1編碼接收,中文自然就成亂碼了,不過由於ISO-8859-1編碼是單位元組編碼所以我們可以使用getBytes("ISO-8859-1"),"utf-8"這樣把文字重新轉換成utf-8 編碼。
第一個傳送的文字是utf-8編碼 而tomcat接收後用錯誤的ISO-8859-1編碼了,這樣getBytes("ISO-8859-1")後會重新得到正確的utf-8編碼的位元組陣列 ,然後用 new 
String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8")重新將位元組編碼成UTF-8編碼的文字這樣文字就正確了。

如果是tomcat的話 server.xml檔案裡
<Connector port="80" protocol="HTTP/1.1"
 connectionTimeout="20000"  redirectPort="8443" URIEncoding="UTF-8"/>
後邊的URIEncoding就是設定get方法編碼的如果沒有指定URL接收的編碼型別,自動會用ISO-8859-1編碼

示例程式碼如下:

/*
 * ====================================================================
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 */

package test;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

/**
 * This example demonstrates how to abort an HTTP method before its normal completion.
 */
public class ClientAbortMethod {

    public final static void main(String[] args) throws Exception {
    	 //post();
    		get();
    }
    
    public static void get()
    {
    	 CloseableHttpClient httpclient = HttpClients.createDefault();
         try {
         	String strUrl = "http://127.0.0.1:8080/Test/servlet/GetTest?info=";
         	String strParam = URLEncoder.encode("你好", "utf-8");
         	strUrl += strParam;
         	HttpGet httpget = new HttpGet(strUrl);
             System.out.println("Executing request " + httpget.getURI());
             CloseableHttpResponse response = httpclient.execute(httpget);
             try {
             	String strInfo = EntityUtils.toString(response.getEntity());
             	System.out.println(strInfo);
                 httpget.abort();
             } finally {
                 response.close();
             }
         } catch(Exception e)
         {
        	 e.printStackTrace();
         }
         finally {
             try {
				httpclient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
         }
    }
    public static void post()
    {
    	try {
			DefaultHttpClient httpclient = new DefaultHttpClient();
			HttpResponse response;
			HttpEntity entity;
			HttpPost httpost = new HttpPost("http://127.0.0.1:8080/Test/servlet/GetTest");
			List <NameValuePair> nvps = new ArrayList <NameValuePair>();
			nvps.add(new BasicNameValuePair("info", "kaxu中文"));
			nvps.add(new BasicNameValuePair("password", "kaxu"));
			httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
			response = httpclient.execute(httpost);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    }

}

服務端的程式碼如下:

package com.neusoft;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GetTest extends HttpServlet {

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");

		PrintWriter out = response.getWriter();
		String info = new String(request.getParameter("info").getBytes("ISO-8859-1"),"utf-8");
		System.out.println(info);
		
		out.flush();
		out.close();
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		request.setCharacterEncoding("utf-8");
		String strInfo = request.getParameter("info");
		String str1 = URLDecoder.decode(strInfo, "utf-8");
		System.out.println(str1);
		
		out.flush();
		out.close();
	}

}



相關推薦

關於HttpClient4.3.*的PostGet提交亂碼問題

無語了都,整了好久,網上各種答案,幾乎都是不行的,在apache的官網和一件網友的資料,現在OK了,分享如下: 這個原因是伺服器導致的,伺服器比如tomcat接收get方法預設使用的是ISO-8859-1編碼,而瀏覽器傳送時文字編碼是和頁面編碼保持一致的,如果頁面是使用u

javaweb中表單postget提交方式出現亂碼原因

最近在學javaweb遇到了亂碼問題,一直不太明白其中的具體原因,看了這篇文章明白了不少。感覺很有用所以把它轉載過來,方便以後檢視。 一、問題:         編碼問題是JAVA初學者在web開發過程中經常會遇到問題,網上也有大量相關的文章介紹,但其中很

Post get 請求亂碼問題處理

原始處理get post 請求亂碼 String newEncoding = new String( params.getBytes("iso-8859-1") , "utf-8" );  原理分析   post 處理亂碼方式 req.setCharac

HttpClient4.3 postget請求工具類完整示例

整個工具類程式碼如下所示,可直接使用! import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; import org.apache

ssm整合--解決POSTGET提交亂碼問題

一,解決post亂碼問題在web.xml中加入:<filter> <filter-name>CharacterEncodingFilter</filter-name>

解決 postget請求亂碼

post亂碼 在web.xml新增post亂碼filter 在web.xml中加入: <filter> <filter-name>CharacterEncodingFilter

Post提交Get提交的區別

顯示 改變 color 多個 自身 height 數據 action 協議 表單提交中get和post的區別 1. get: 把表單內各個字段均顯示在URL中。 post:把表單內各個字段和內容放在html的header內一起傳遞給action所指的url,用戶看不

HTML提交方式postget區別(實驗)

des url action 通過 性別 清除數據 map pass pack HTML提交方式post和get區別(實驗) 一、post和get區別 get提交,提交的信息都顯示在地址欄中。 post提交,提交的信息不顯示地址欄中,顯示在消息體中。 二、客戶端代碼

解決全站字符亂碼POSTGET中文編碼問題)

{} tomcat ont throws turn nco cat doget pro 1 說明 亂碼問題: 獲取請求參數中的亂碼問題; POST請求:request.setCharacterEncoding(“utf-8”); GET請求:new String(r

PostGet請求亂碼的原因解決方案

閱讀須知: 在每個頁面的開頭處,都會有一行: <%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%> contentType="text/html

HttpClient用PostGet帶引數提交幫助類

  轉載自https://blog.csdn.net/nevergiveuplzl/article/details/52304266 import java.util.ArrayList;  import java.util.List;  import java

Tomcat設定postget最大提交

<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" <span style="color:#cc0000;">maxParamet

解決postget請求的亂碼問題

亂碼問題 1.解決post中文亂碼問題 2.解決get請求中文引數亂碼 1.解決post中文亂碼問題 新增一個spring提供的過濾器 , 將編碼設定為utf-8 在web.xml中加入以下配置資訊

java使用PostGet方式提交Http請求通用

很多api提供了java的post,get方式呼叫返回結果的介面,以下記錄基礎通用的傳送請求並接收返回引數的方式:package com.taray.test; import java.io.BufferedReader; import java.io.IOException

個人寫的http介面測試頁面,支援postget引數提交

因為工作交接需要,花了一會寫的一個類似線上介面測試頁面,如果電腦能跑php,就可以直接使用,歡迎指點改進: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8

PostGet請求之間的區別以及如何避免出現中文亂碼

解析:由於Get是沒有請求體的,所以它並不能直接設定編碼格式,但是在應用中,我們又不能出現中文亂碼,所以Bytes[] b1 =username.getBytes(“iso-8859-1”);//回退這句程式碼的作用,就是相當於回退,由於Toncat的編碼格式是ISO-8859-1,所以它會把資料從字串轉化為

如何解決POSTGET方式的中文亂碼問題

一:確保表單所在的頁面按照指定的字符集開啟★在HTML頁面中使用meta標記可以確保瀏覽器按照指定的字符集進行解碼頁面,並限定表單提交時的資料編碼方式:<meta http-equiv="content-type" content="text/html;charset=utf-8">:完成ISO-

springmvc中Postget亂碼的解決

第一種方法依賴於tomcate6中webapps\examples\WEB-INF\classes\filters下SetCharacterEncodingFilter這個類 實現方法在web.xml 中新增以下程式碼 <filter>   <filter

form表單的postget提交方式分析以及產生的亂碼問題

Form提供了兩種資料傳輸的方式——get和post。雖然它們都是資料的提交方式,但是在實際傳輸時確有很大的不同,並且可能會對資料產生嚴重的影響。雖然為了方便的得到變數值,Web容器已經遮蔽了二者的一些差異,但是瞭解二者的差異在以後的程式設計也會很有幫助的。 Form中的g

ajax的post提交get提交實現前後端互動

(一)json格式(兩種) 物件格式:{"key1":obj,"key2":obj,"key3":obj...} 陣列/集合格式:[obj,obj,obj...] (二)json格式書寫練習 (1) <!DOCTYPE HTML PUBLIC "-/