java代理訪問https
① java爬蟲訪問https,本地開發是win7系統,可以正常爬到數據,上傳到linux伺服器不能獲取數據,怎麼解決
可能是字元串編碼問題。
② java httpclient4.1.2 怎麼使用免費的https代理
DefaultHttpClient httpclient = new DefaultHttpClient();
String proxyIp=xxx.xxx.xxx.xxx;
int port=xxxx;
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,new HttpHost(proxyIp,port));
這樣設置就可以了
③ 怎樣抓取jvm的https網路請求
用gradle構建時,常有需要去查看其網路請求,怎樣抓取其網路請求呢?下面介紹gradle代理到charles上的抓包辦法。
由於gradle是運行在jvm上,所以配置jvm的代理方法,即是實現了對gradle的代理,代理設置分為步:
在gradle上設置jvm的代理有兩種方式
gradle在運行時自動會將屬性設置載入到jvm中。
代理設置完成後,發現http請求是可以在charles中正常代理查看的,但https請求卻無法代理成功。原因是jvm上https的ssl握手環節證書驗證不通過。由於Charles是以中間人的方式代理https請求,所以需要將charles的證書添加到jvm信任證書的列表中去。
java工具包中集成了證書管理工具keytool,只需要用它將代理工具的證書(charles證書)導入到jvm證書信任列表中即可。
導入方法:
JAVA_HOME是系統的java的安裝目錄。
jvm證書倉庫的默認密碼是「changeit」,如果修改過,請用重設的密碼替換它。
certAliasName 是你給導入的證書起的名字。
certPath.cert 是導入的證書路徑
④ Java怎麼設置代理來訪問網路
你的問題應該是:在java中通過編程設置代理伺服器並訪問網路,現在作答如下:
1,講解一下基礎知識:
HTTP:是應用層協議,是基於傳輸層協議的。
TCP: 是傳輸層協議,是基於網路層協議的。
IP: 是網路層協議。
一個TCP的連接要進行三次握手(就像轉戶口一樣,不詳說),HTTP只是一個應用協議,也就是相當於一個自定義協議,即其沒有對底層的傳輸方式進行干涉,只是對數據內容格式進行了定義。
2,我們再說說HTTP代理,從上可以理解,HTTP代理伺服器就是這樣一台機器:你把所有的HTTP請求都發到這個 HTTP代理伺服器,然後這個HTTP代理伺服器請求你要訪問的最終地址,把響應回傳給你。這里還要注意它代理的是HTTP協議,而HTTP又是基於 TCP的,也就是說這個伺服器代理的是指定HTTP內容格式的TCP連接。再說下去也沒意思了,看以下代碼:
//以下地址是代理伺服器的地址
Socket socket = new Socket("10.1.2.188", 80);
//寫與的內容就是遵循HTTP請求協議格式的內容,請求網路
socket.getOutputStream().write(new String("GET http://www..com/ HTTP/1.1\r\n\r\n").getBytes());
byte[] bs = new byte[1024];
InputStream is = socket.getInputStream();
int i;
while ((i = is.read(bs)) > 0) {
System.out.println(new String(bs, 0, i));
}
is.close();
3,當然在Java中,有Proxy代理上網的使用,此時使用URL(HTTP)就不涉及Socket(TCP)了,看如下代碼
//設置代理
System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost", "10.1.2.188");
System.setProperty("http.proxyPort", "80");
//直接訪問目的地址
URL url = new URL("http://www..com");
URLConnection con = url.openConnection();
InputStreamReader isr = new InputStreamReader(con.getInputStream());
char[] cs = new char[1024];
int i = 0;
while ((i = isr.read(cs)) > 0) {
System.out.println(new String(cs, 0, i));
}
isr.close();
⑤ java後台程序怎麼用https協議
嗨 你好
據網上了解到:
在JSP里,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了。
如果使用了反向代理軟體,將:2046/ 的URL反向代理為 / 的URL時,用request.getRemoteAddr()方法獲取的IP地址是:127.0.0.1或192.168.1.110,而並不是客戶端的真實IP。
經過代理以後,由於在客戶端和服務之間增加了中間層,因此伺服器無法直接拿到客戶端的IP,伺服器端應用也無法直接通過轉發請求的地址返回給客戶端。但是在轉發請求的HTTP頭信息中,增加了X-FORWARDED-FOR信息。用以跟蹤原有的客戶端IP地址和原來客戶端請求的伺服器地址。當我們訪問 /index.jsp/ 時,其實並不是我們瀏覽器真正訪問到了伺服器上的index.jsp文件,而是先由代理伺服器去訪問:2046/index.jsp ,代理伺服器再將訪問到的結果返回給我們的瀏覽器,因為是代理伺服器去訪問index.jsp的,所以index.jsp中通過request.getRemoteAddr()的方法獲取的IP實際上是代理伺服器的地址,並不是客戶端的IP地址。
於是可得出獲得客戶端真實IP地址的方法一:
public String getRemortIP(HttpServletRequest request) { if (request.getHeader("x-forwarded-for") == null) { return request.getRemoteAddr(); } return request.getHeader("x-forwarded-for"); }
可是當我訪問 /index.jsp/ 時,返回的IP地址始終是unknown,也並不是如上所示的127.0.0.1或192.168.1.110了,而我訪問:2046/index.jsp 時,則能返回客戶端的真實IP地址,寫了個方法去驗證。原因出在了Squid上。squid.conf 的配製文件forwarded_for 項默認是為on,如果 forwarded_for 設成了 off 則:X-Forwarded-For: unknown
於是可得出獲得客戶端真實IP地址的方法二:
public String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; }
可是,如果通過了多級反向代理的話,X-Forwarded-For的值並不止一個,而是一串Ip值,究竟哪個才是真正的用戶端的真實IP呢?
答案是取X-Forwarded-For中第一個非unknown的有效IP字元串。
如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100用戶真實IP為: 192.168.1.110
希望可以幫到你的忙
祝你學習愉快
-
⑥ Java的HttpClient如何去支持無證書訪問https
SSL 連接的 context 目前用那個 KeyManager, TrustManager 的實現(Sun 公司提供的)都是默認地從命令行提供的參數或代碼中明確初始化的 trust manager / key manager 中查找的,這裡面可以肯定的是這個參數在連接建立之前已經固定了的靜態形式,這要求我們把可以信任的伺服器證書的頒發機構的根證書先導入到 trust store 中然後指派給 java 程序。
因此當我們的伺服器使用了一張不在 trust store 中的信任根證書機構名錄中的證書是不會被信任的,因此我們必須提供一個有別於 Sun 的 Trust Manager 介面的實現類,然後像 IE 瀏覽器那樣在查找證書來確認是否信任時彈出一個對話框出來讓用戶檢查,當用戶點擊「以後一直信任該證書的廠商」時我們把它緩存在持久性介質(比如文件或資料庫)中,下次訪問時先看是否有緩存的,沒有再來彈對話框讓用戶確認,當伺服器要求客戶端出示客戶端證書時(比如網銀業務)我們同樣需要提供自己的 key manager 實現。
⑦ 如何使用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();
}
⑧ 用java代碼發生請求https,發生異常!
因為你的異常不是能必定復現的,有時發生,又有時不發生,那麼只能初步的認為是網路連接不穩定造成的
如果想徹底查清問題所在,只能通過網路抓包工具,在復現問題時查看網路通信包,看看到底是網路連接報的錯誤還是代碼邏輯報的錯誤
另外,Remote host closed connection ring handshake這個異常在客戶端/服務端的TLS版本不一致時也會拋出,你可以嘗試在發送請求前在代碼中設置TLS版本和服務端一致後在發送請求,相關問題和解決方案stackoverflow上能查到很多
⑨ java實現https反向代理,提示瀏覽器版本低
更新即可。java實現https反向代理,提示瀏覽器版本低更新即可。反向代理方式是指以代理伺服器來接受internet上的連接請求,然後將請求轉發給內部網路上的伺服器。
⑩ Java 中怎樣在程序中設置代理伺服器
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.net.Authenticator;
importjava.net.HttpURLConnection;
importjava.net.InetSocketAddress;
importjava.net.PasswordAuthentication;
importjava.net.Proxy;
importjava.net.URL;
publicclassProxyDemo2{
publicstaticvoidmain(String[]args)throwsException{
URLurl=newURL("http://www.3lai8.com");
///創建代理伺服器
InetSocketAddressaddr=newInetSocketAddress("192.168.0.254",8080);
//Proxyproxy=newProxy(Proxy.Type.SOCKS,addr);//Socket代理
Proxyproxy=newProxy(Proxy.Type.HTTP,addr);//http代理
Authenticator.setDefault(newMyAuthenticator("username","password"));//設置代理的用戶和密碼
HttpURLConnectionconnection=(HttpURLConnection)url.openConnection(proxy);//設置代理訪問
InputStreamReaderin=newInputStreamReader(connection.getInputStream());
BufferedReaderreader=newBufferedReader(in);
while(true){
Strings=reader.readLine();
if(s!=null){
System.out.println(s);
}
}
}
{
privateStringuser="";
privateStringpassword="";
publicMyAuthenticator(Stringuser,Stringpassword){
this.user=user;
this.password=password;
}
(){
(user,password.toCharArray());
}
}
}