2015-12-16 99 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()”谢谢 –