<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Latest posts for the topic "如何用httpclient4去存取SSL的網頁資料?"]]></title>
		<link>https://forum.andowson.com/posts/list/5.page</link>
		<description><![CDATA[Latest messages posted in the topic "如何用httpclient4去存取SSL的網頁資料?"]]></description>
		<generator>JForum - http://www.jforum.net</generator>
			<item>
				<title>如何用httpclient4去存取SSL的網頁資料?</title>
				<description><![CDATA[ 版主，您好， 
<br>
<br>
我想用httpclient4來存取SSL的網頁，但又不想匯入對方憑証，有什麼好方法嗎?感謝!]]></description>
				<guid isPermaLink="true">https://forum.andowson.com/posts/preList/484/1003.page</guid>
				<link>https://forum.andowson.com/posts/preList/484/1003.page</link>
				<pubDate><![CDATA[Tue, 10 May 2011 17:05:55]]> GMT</pubDate>
				<author><![CDATA[ collectWu]]></author>
			</item>
			<item>
				<title>回覆:如何用httpclient4去存取SSL的網頁資料?</title>
				<description><![CDATA[ 下載函式庫: HttpClient 4.1.1 (GA) 
<br>
http://hc.apache.org/downloads.cgi 
<br>
<br>
預先安裝函式庫:commons-logging-1.1.1.jar, httpcore-4.1.jar, httpclient-4.1.1.jar 
<br>
<br>
這裡我以Servlet 3.0標準來當做練習，請在Tomcat 7.0以上版本執行： 
<br>
HttpClientServlet.java: 
<br>
[code]package com.andowson.httpclient; 
<br>
<br>
import java.io.IOException; 
<br>
import java.io.PrintWriter; 
<br>
import java.security.KeyManagementException; 
<br>
import java.security.NoSuchAlgorithmException; 
<br>
import java.security.cert.CertificateException; 
<br>
import java.security.cert.X509Certificate; 
<br>
<br>
import javax.net.ssl.SSLContext; 
<br>
import javax.net.ssl.TrustManager; 
<br>
import javax.net.ssl.X509TrustManager; 
<br>
import javax.servlet.Servlet; 
<br>
import javax.servlet.ServletException; 
<br>
import javax.servlet.annotation.WebServlet; 
<br>
import javax.servlet.http.HttpServlet; 
<br>
import javax.servlet.http.HttpServletRequest; 
<br>
import javax.servlet.http.HttpServletResponse; 
<br>
<br>
import org.apache.http.HttpEntity; 
<br>
import org.apache.http.HttpHost; 
<br>
import org.apache.http.HttpResponse; 
<br>
import org.apache.http.client.ResponseHandler; 
<br>
import org.apache.http.client.methods.HttpGet; 
<br>
import org.apache.http.conn.params.ConnRoutePNames; 
<br>
import org.apache.http.conn.scheme.Scheme; 
<br>
import org.apache.http.conn.ssl.SSLSocketFactory; 
<br>
import org.apache.http.impl.client.BasicResponseHandler; 
<br>
import org.apache.http.impl.client.DefaultHttpClient; 
<br>
import org.apache.http.util.EntityUtils; 
<br>
<br>
/** 
<br>
 * Servlet implementation class HttpClientServlet 
<br>
 */ 
<br>
@WebServlet("/HttpClientServlet") 
<br>
public class HttpClientServlet extends HttpServlet { 
<br>
 private static final long serialVersionUID = 1L; 
<br>
<br>
 /** 
<br>
 * @see HttpServlet#HttpServlet() 
<br>
 */ 
<br>
 public HttpClientServlet() { 
<br>
 super(); 
<br>
 } 
<br>
<br>
 /** 
<br>
 * @see Servlet#getServletInfo() 
<br>
 */ 
<br>
 public String getServletInfo() { 
<br>
 return "HttpClient Servlet"; 
<br>
 } 
<br>
<br>
 /** 
<br>
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
<br>
 */ 
<br>
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
<br>
 String url = request.getParameter("url"); 
<br>
 if (url == null) { 
<br>
 url = "https://ups.moe.edu.tw/"; 
<br>
 } 
<br>
<br>
 DefaultHttpClient httpclient = new DefaultHttpClient(); 
<br>
 HttpHost proxy = new HttpHost("10.160.3.88", 8080); 
<br>
 httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 
<br>
 try { 
<br>
 TrustManager easyTrustManager = new X509TrustManager() { 
<br>
<br>
 @Override 
<br>
 public void checkClientTrusted( 
<br>
 X509Certificate[] chain, 
<br>
 String authType) throws CertificateException { 
<br>
 // Oh, I am easy! 
<br>
 } 
<br>
<br>
 @Override 
<br>
 public void checkServerTrusted( 
<br>
 X509Certificate[] chain, 
<br>
 String authType) throws CertificateException { 
<br>
 // Oh, I am easy! 
<br>
 } 
<br>
<br>
 @Override 
<br>
 public X509Certificate[] getAcceptedIssuers() { 
<br>
 return null; 
<br>
 } 
<br>
 }; 
<br>
<br>
 SSLContext sslcontext = SSLContext.getInstance("TLS"); 
<br>
 sslcontext.init(null, new TrustManager[] { easyTrustManager }, null); 
<br>
<br>
 SSLSocketFactory socketFactory = new SSLSocketFactory(sslcontext, 
<br>
 SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
<br>
 Scheme sch = new Scheme("https", 443, socketFactory); 
<br>
 httpclient.getConnectionManager().getSchemeRegistry().register(sch); 
<br>
<br>
 HttpGet httpget = new HttpGet(url); 
<br>
<br>
 System.out.println("executing request " + httpget.getRequestLine()); 
<br>
<br>
 HttpResponse resp = httpclient.execute(httpget); 
<br>
 HttpEntity entity = resp.getEntity(); 
<br>
 System.out.println("----------------------------------------"); 
<br>
 System.out.println(resp.getStatusLine()); 
<br>
 if (entity != null) { 
<br>
 System.out.println("Response content length: " + entity.getContentLength()); 
<br>
 } 
<br>
 EntityUtils.consume(entity); 
<br>
<br>
 response.setContentType(entity.getContentType().toString()); 
<br>
 PrintWriter out = response.getWriter(); 
<br>
<br>
 ResponseHandler&lt;String&gt; responseHandler = new BasicResponseHandler(); 
<br>
 String responseBody = httpclient.execute(httpget, responseHandler); 
<br>
 System.out.println("----------------------------------------"); 
<br>
 System.out.println(responseBody); 
<br>
 out.println(responseBody); 
<br>
 System.out.println("----------------------------------------"); 
<br>
 } catch (NoSuchAlgorithmException e) { 
<br>
 e.printStackTrace(); 
<br>
 } catch (KeyManagementException e) { 
<br>
 e.printStackTrace(); 
<br>
 } finally { 
<br>
 httpclient.getConnectionManager().shutdown(); 
<br>
 } 
<br>
 } 
<br>
<br>
 /** 
<br>
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
<br>
 */ 
<br>
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
<br>
 doGet(request, response); 
<br>
 } 
<br>
<br>
}[/code] 
<br>
<br>
修改web.xml，加入下列項目: 
<br>
[code=xml] 
<br>
 &lt;servlet&gt; 
<br>
 &lt;servlet-name&gt;HttpClientServlet&lt;/servlet-name&gt; 
<br>
 &lt;servlet-class&gt;com.andowson.httpclient.HttpClientServlet&lt;/servlet-class&gt; 
<br>
 &lt;/servlet&gt; 
<br>
 &lt;servlet-mapping&gt; 
<br>
 &lt;servlet-name&gt;HttpClientServlet&lt;/servlet-name&gt; 
<br>
 &lt;url-pattern&gt;/servlet/httpclient&lt;/url-pattern&gt; 
<br>
 &lt;/servlet-mapping&gt; 
<br>
[/code] 
<br>
<br>
說明： 
<br>
63-64行是如果伺服器需要透過Proxy才能連到Internet(例如公司內部網站）執行時需透過Proxy的設定方式，如果伺服器可以直接連接到Internet時這兩行需要mark為註解掉。 
<br>
<br>
參考資料： 
<br>
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e537]]></description>
				<guid isPermaLink="true">https://forum.andowson.com/posts/preList/484/1009.page</guid>
				<link>https://forum.andowson.com/posts/preList/484/1009.page</link>
				<pubDate><![CDATA[Wed, 18 May 2011 11:54:41]]> GMT</pubDate>
				<author><![CDATA[ andowson]]></author>
			</item>
			<item>
				<title>回覆:如何用httpclient4去存取SSL的網頁資料?</title>
				<description><![CDATA[ 如果要輸出檔案的話,也非常簡便,可以使用HttpEntity 提供的方法: writeTo() 
<br>
<br>
比以下常用的寫法節省不少程式, 也避免了特殊字無法正常輸出的情況: 
<br>
[code] 
<br>
FileOutputStream fos = new FileOutputStream(request.getParameter("path")); 
<br>
ByteArrayInputStream bais = new ByteArrayInputStream(httpclient.execute(httpget, responseHandler).getBytes()); 
<br>
<br>
byte[] bytes = new byte[1024]; 
<br>
int count = 0; 
<br>
<br>
while (bais!=null &amp;&amp; (count = bais.read(bytes))!=-1) { 
<br>
 fos.write(bytes, 0, count); 
<br>
} 
<br>
[/code] 
<br>
<br>
可於版主提供的程式105行中,加入以下程式 
<br>
<br>
[code] 
<br>
entity.writeTo(new FileOutputStream(request.getParameter("path"))); 
<br>
[/code]]]></description>
				<guid isPermaLink="true">https://forum.andowson.com/posts/preList/484/1018.page</guid>
				<link>https://forum.andowson.com/posts/preList/484/1018.page</link>
				<pubDate><![CDATA[Thu, 2 Jun 2011 15:01:07]]> GMT</pubDate>
				<author><![CDATA[ bious3927]]></author>
			</item>
	</channel>
</rss>