2015-12-16 97 views
0

我得到連接超時:在URL中使用用戶名和密碼時連接異常。網址是「http://testadmin:[email protected]/manager/text/list」;獲取連接超時:連接

此網址在鉻,Firefox瀏覽器中工作,但當我要通過Java代碼訪問此URL。

這裏是輸出和例外,我得到:

&&&&&&&&&&&&&&& 
*********88 
response 
java.net.ConnectException: Connection timed out: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at sun.net.NetworkClient.doConnect(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.<init>(Unknown Source) 
    at sun.net.www.http.HttpClient.New(Unknown Source) 
    at sun.net.www.http.HttpClient.New(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at test.TomcatTest.main(TomcatTest.java:23) 

我使用下面的代碼。

package test; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 

public class TomcatTest { 


    public static void main(String[] args) { 
     String listUrl = "http://testadmin:[email protected]/manager/text/list"; 
     String serverResponse = ""; 
     URL url = null; 
     try { 
      System.out.println("&&&&&&&&&&&&&&&"); 
      url = new URL(listUrl); 
      URLConnection connection = url.openConnection(); 
      System.out.println("*********88"); 
      // i also tried without setting readtimeout. 
      connection.setReadTimeout(3 * 60 * 1000);// set timeout 3 minutes 
      InputStream inputStream = connection.getInputStream(); 
      System.out.println("^^^^^^^^^^^^^"); 
      int chr = -1; 
      while ((chr = inputStream.read()) != -1) { 
       System.out.print((char)chr); 
       serverResponse += (char)chr; 
      } 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("response " + serverResponse); 
    } 
} 

回答

0

現在我有一個解決方案,我們不能像上面那樣在URL中使用用戶名和密碼。

它可以像這樣使用:

String listUrl = "http://myHostName/manager/text/list"; 
//use username and password here 
connection.setRequestProperty("Authorization", String.format("Basic %s", new BASE64Encoder().encode("testadmin:testadmin".getBytes("UTF-8")))); 
1

的URL http://<user>:<pass>@url不以這種方式在Web服務器發送。瀏覽器從URL中取出用戶名和密碼,並創建一個basic authentication標題。

Java從字面上將URL發送到服務器。這是一個安全問題,因爲URL可能會在幾個階段被記錄。

這個演示代碼是基於answer by Wanderson Santos and joel234與Java 8的Base64 adaptions 99%:

String _url_string = "http://server/" 

url = new URL(_url_string); 
URLConnection uc = url.openConnection(); 
String userpass = _user + ":" + _password; 
String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes())); 
uc.setRequestProperty("Authorization", basicAuth); 
InputStream in = uc.getInputStream(); 
+0

感謝@筆記寺,這是與我有關。 –

+0

@AjayYadav如果你覺得我的答案是有用的,比投票。如果你覺得我的答案正在解決你的任務,那麼請點擊鉤子。將問題的標題更改爲somethong更多meningful「獲取連接超時:URL.openConnection()」謝謝 –