javahttps請求
㈠ 求解java怎樣發送https請求
使用httpClient可以發送,具體的可以參考下面的代碼
SSLClient類,繼承至HttpClient
importjava.security.cert.CertificateException;
importjava.security.cert.X509Certificate;
importjavax.net.ssl.SSLContext;
importjavax.net.ssl.TrustManager;
importjavax.net.ssl.X509TrustManager;
importorg.apache.http.conn.ClientConnectionManager;
importorg.apache.http.conn.scheme.Scheme;
importorg.apache.http.conn.scheme.SchemeRegistry;
importorg.apache.http.conn.ssl.SSLSocketFactory;
importorg.apache.http.impl.client.DefaultHttpClient;
//用於進行Https請求的HttpClient
{
publicSSLClient()throwsException{
super();
SSLContextctx=SSLContext.getInstance("TLS");
X509TrustManagertm=newX509TrustManager(){
@Override
publicvoidcheckClientTrusted(X509Certificate[]chain,
StringauthType)throwsCertificateException{
}
@Override
publicvoidcheckServerTrusted(X509Certificate[]chain,
StringauthType)throwsCertificateException{
}
@Override
publicX509Certificate[]getAcceptedIssuers(){
returnnull;
}
};
ctx.init(null,newTrustManager[]{tm},null);
SSLSocketFactoryssf=newSSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
ClientConnectionManagerccm=this.getConnectionManager();
SchemeRegistrysr=ccm.getSchemeRegistry();
sr.register(newScheme("https",443,ssf));
}
}
HttpClient發送post請求的類
importjava.util.ArrayList;
importjava.util.Iterator;
importjava.util.List;
importjava.util.Map;
importjava.util.Map.Entry;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.NameValuePair;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.message.BasicNameValuePair;
importorg.apache.http.util.EntityUtils;
/*
*利用HttpClient進行post請求的工具類
*/
publicclassHttpClientUtil{
publicStringdoPost(Stringurl,Map<String,String>map,Stringcharset){
HttpClienthttpClient=null;
HttpPosthttpPost=null;
Stringresult=null;
try{
httpClient=newSSLClient();
httpPost=newHttpPost(url);
//設置參數
List<NameValuePair>list=newArrayList<NameValuePair>();
Iteratoriterator=map.entrySet().iterator();
while(iterator.hasNext()){
Entry<String,String>elem=(Entry<String,String>)iterator.next();
list.add(newBasicNameValuePair(elem.getKey(),elem.getValue()));
}
if(list.size()>0){
UrlEncodedFormEntityentity=newUrlEncodedFormEntity(list,charset);
httpPost.setEntity(entity);
}
HttpResponseresponse=httpClient.execute(httpPost);
if(response!=null){
HttpEntityresEntity=response.getEntity();
if(resEntity!=null){
result=EntityUtils.toString(resEntity,charset);
}
}
}catch(Exceptionex){
ex.printStackTrace();
}
returnresult;
}
}
測試代碼
importjava.util.HashMap;
importjava.util.Map;
//對介面進行測試
publicclassTestMain{
privateStringurl="https://192.168.1.101/";
privateStringcharset="utf-8";
=null;
publicTestMain(){
httpClientUtil=newHttpClientUtil();
}
publicvoidtest(){
StringhttpOrgCreateTest=url+"httpOrg/create";
Map<String,String>createMap=newHashMap<String,String>();
createMap.put("authuser","*****");
createMap.put("authpass","*****");
createMap.put("orgkey","****");
createMap.put("orgname","****");
StringhttpOrgCreateTestRtn=httpClientUtil.doPost(httpOrgCreateTest,createMap,charset);
System.out.println("result:"+httpOrgCreateTestRtn);
}
publicstaticvoidmain(String[]args){
TestMainmain=newTestMain();
main.test();
}
}
㈡ 如何在java中發起http和https請求
1.寫http請求方法
[java] view plain
//處理http請求 requestUrl為請求地址 requestMethod請求方式,值為"GET"或"POST"
public static String httpRequest(String requestUrl,String requestMethod,String outputStr){
StringBuffer buffer=null;
try{
URL url=new URL(requestUrl);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod(requestMethod);
conn.connect();
//往伺服器端寫內容 也就是發起http請求需要帶的參數
if(null!=outputStr){
OutputStream os=conn.getOutputStream();
os.write(outputStr.getBytes("utf-8"));
os.close();
}
//讀取伺服器端返回的內容
InputStream is=conn.getInputStream();
InputStreamReader isr=new InputStreamReader(is,"utf-8");
BufferedReader br=new BufferedReader(isr);
buffer=new StringBuffer();
String line=null;
while((line=br.readLine())!=null){
buffer.append(line);
}
}catch(Exception e){
e.printStackTrace();
}
return buffer.toString();
}
㈢ java 怎樣接受https請求
如果原生的話,通過web.xml配置servlet,然後你的url定位到這個servlet就行了。
㈣ 如何使用JAVA請求HTTPS
//處理http請求requestUrl為請求地址requestMethod請求方式,值為"GET"或"POST"
publicstaticStringhttpRequest(StringrequestUrl,StringrequestMethod,StringoutputStr){
StringBufferbuffer=null;
try{
URLurl=newURL(requestUrl);
HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod(requestMethod);
conn.connect();
//往伺服器端寫內容也就是發起http請求需要帶的參數
if(null!=outputStr){
OutputStreamos=conn.getOutputStream();
os.write(outputStr.getBytes("utf-8"));
os.close();
}
//讀取伺服器端返回的內容
InputStreamis=conn.getInputStream();
InputStreamReaderisr=newInputStreamReader(is,"utf-8");
BufferedReaderbr=newBufferedReader(isr);
buffer=newStringBuffer();
Stringline=null;
while((line=br.readLine())!=null){
buffer.append(line);
}
}catch(Exceptione){
e.printStackTrace();
}
returnbuffer.toString();
}
㈤ https證書到期會影響java請求么
會
在java代碼中請求https鏈接的時候,可能會報下面這個錯誤
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
原因是沒有證書。在瀏覽器中直接使用url訪問是可以的,應該是瀏覽器之前就保存過對應的.cer證書。
解決方法有兩種,從目標機器獲得有效證書或者忽略證書信任問題。
一、獲得目標機器有效證書
1、編譯安裝證書程序 javac InstallCert.java
2、運行安裝證書程序生成證書
java InstallCert my.hoolai.com
例如:java InstalCert smtp.zhangsan.com:465 admin
如果不加參數password和host的埠號,上面的獲取證書程序中默認給的埠號是:443,密碼是:changeit
3、根據運行提示信息,輸入1,回車,在當前目錄下生成名為: jssecacerts 的證書
將證書放置到$JAVA_HOME/jre/lib/security目錄下, 切記該JDK的jre是工程所用的環境!!!
或者:
System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts證書路徑");
可以更改密碼,在security目錄下運行命令
keytool -storepasswd -new xxxcom -keystore cacerts
就可以修改密碼,修改後使用命令
keytool -list -v -keystore cacerts
查看文件的信息,會提示需要密碼才能查看,如果輸入密碼與修改後的密碼匹配,說明修改成功了。
PS:至此這種方式可以成功使用ssl了,另外再補充一下,根據剛才生成的文件jssecacerts,可以生成cer文件,
命令如下
keytool -export -alias xxx.com-1 -keystore jssecacerts -rfc -file xxx.cer
如上,之前的工具類中默認命名別名是加上"-1"。使用InstallCert設置的密碼需要跟cacerts文件中的密碼一致,
如果修改過密碼,就需要修改InstallCert類中對應的密碼字元串,否則會有下面這個異常:
java.security.UnrecoverableKeyException: Password verification failed
二、忽略證書信任問題
源碼:http://mengyang.iteye.com/blog/575671
一定要注意需要在connection創建之前調用文章里所述的方法,像這個樣子:
trustAllHttpsCertificates();
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
connection = (HttpURLConnection) url.openConnection();
好吧,兩種方法都試過有效。
㈥ java https請求 中文亂碼問題
嘗試的方法:
1. 在服務端接收到參數時,utf-8轉gbk,無效。
2. 在服務端接收到參數時,iso-8859-1轉gbk,無效。
3. 在發送請求前將中文參數轉碼,utf-8轉iso-8859-1,無效。代碼如下:
new String(remark.getBytes(「UTF-8」), 「ISO-8859-1」)
4. 在請求端,HttpHeader設定ContentType為「application/json;UTF-8」,無效。代碼如下:
headers.setContentType(Media.valueOf(「application/json;UTF-8」));
寫到這里,有人應該感覺到這有點「病急亂投醫」的感覺了,沒有頭緒地在試著各種方式。是的,起初我覺得是請求header中採用了ISO-8859-1的編碼,但嘗試後很顯然不是;後來我覺著是否是RestTemplate中採用的HttpMessageConverter方式所決定的,但沒能找到很好的證明方式,查資料說的是StringHttpMessageConverter默認採用的是ISO-8859-1編碼,可我覺得我指定了ContentType為application/json,RestTemplate不應該去調用StringHttpMessageConverter啊,其中的原理還有待深究。個人感覺這種情況出問題的可能性最大。
最後,在網上看到一篇文章後,看了一種建議方式,並且是可行的,就是使用URLEncode,將中文參數在傳參前進行encode.這里以GBK編碼是為了在伺服器端接收參數後無需再轉碼了,如下:
list.add(URLEncode.encode(name, 「GBK」));
URLEncode方式可以解決這種特定場景的中文亂碼問題,相信理解其原理後還可以運用到更多的場景。目前我在網上看到的,關於用URLEncode處理中文亂碼最多的場景就是文件下載時中文文件名亂碼。
㈦ 用java代碼發生請求https,發生異常!
因為你的異常不是能必定復現的,有時發生,又有時不發生,那麼只能初步的認為是網路連接不穩定造成的
如果想徹底查清問題所在,只能通過網路抓包工具,在復現問題時查看網路通信包,看看到底是網路連接報的錯誤還是代碼邏輯報的錯誤
另外,Remote host closed connection ring handshake這個異常在客戶端/服務端的TLS版本不一致時也會拋出,你可以嘗試在發送請求前在代碼中設置TLS版本和服務端一致後在發送請求,相關問題和解決方案stackoverflow上能查到很多