当前位置: 首页 > 知识库问答 >
问题:

使用Java-Java中的基本身份验证连接到URL。网ConnectException:连接被拒绝:连接

李鸿
2023-03-14

我试图连接到一个需要基本身份验证的网站,但我得到了一个java。网ConnectException:拒绝连接:连接,我无法获取内容,基本身份验证依赖于Base64编码的“Authorization”标头,其值由单词“Basic”后跟空格,后跟Base64编码的名称:password组成。当然,使用浏览器我可以得到我想要的正确的json文件

    public static void main(String[] args) {

            try {

System.setProperty("http.proxyHost", PROXY_HOST);
            System.setProperty("http.proxyPort", PROXY_PORT);
            setAuthenticator();

                String webPage = "https://foo.com/developers/apps.json";


                String name = "myUserName";
                String password = "myPassword";

                String authString = name + ":" + password;
                System.out.println("auth string: " + authString);
                byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
                String authStringEnc = new String(authEncBytes);
                System.out.println("Base64 encoded auth string: " + authStringEnc);

                URL url = new URL(webPage);
                URLConnection urlConnection = url.openConnection();

                String encoded = new String (base64Encode(new String("j0a3t:d3jk6ft")));
                urlConnection.setRequestProperty("Proxy-Authorization", "Basic " + encoded);

                urlConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);
                InputStream is = urlConnection.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);

                int numCharsRead;
                char[] charArray = new char[1024];
                StringBuffer sb = new StringBuffer();
                while ((numCharsRead = isr.read(charArray)) > 0) {
                    sb.append(charArray, 0, numCharsRead);
                }
                String result = sb.toString();

                System.out.println("*** BEGIN ***");
                System.out.println(result);
                System.out.println("*** END ***");
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

我在另一个程序中得到了相同的结果:

public class Application {

    public static void main(String[] args) throws ClientProtocolException, IOException {


        DefaultHttpClient httpclient = new DefaultHttpClient();

         HttpHost target = new HttpHost("foo.com", 80, "http");
         HttpGet getRequest = new HttpGet("/developers/apps.json");

         HttpResponse httpResponse = httpclient.execute(target, getRequest);
         HttpEntity entity = httpResponse.getEntity();

    }
}

这里是printStackTrace:

Base64 encoded auth string: cmljYXJkLm9sbGVAZ21hBWwuY25tOkljb17vZmNvaWwxMDA=
java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:529)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:564)
    at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:141)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:163)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:395)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:530)
    at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:272)
    at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:329)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:172)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:158)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
    at com.sigfox.tests.ConnectToUrlUsingBasicAuthentication.main(ConnectToUrlUsingBasicAuthentication.java:46)

共有3个答案

芮宇航
2023-03-14

试着去掉那些线

System.setProperty("http.proxyHost", PROXY_HOST);
System.setProperty("http.proxyPort", PROXY_PORT);

它将显示是否是代理问题。

谭骏
2023-03-14

从表面上看,这似乎是一个代理身份验证错误。尝试使用Apache HC 4. x,Apache文档检查它

如果您使用的是windows代理服务器,请尝试使用NTLM身份验证(第4.7节)

对于第一个过程,尝试通过添加授权头(就像您在代码中所做的那样)进行抢占式身份验证,这样您就可以跳过401

松元明
2023-03-14

要小心区别Proxy身份验证和URI身份验证。

这里有一个uri身份验证的示例[如果需要对uri进行身份验证]:

        BASE64Encoder encoder = new BASE64Encoder();//import sun.misc.BASE64Encoder;
        String authString = name + ":" + password;
        String authStringEncoded = encoder.encode(authString.getBytes());
        setHeader("Authorization", "Basic " + authStringEncoded);

这适用于代理身份验证[如果您需要通过代理进入internet]:

            BASE64Encoder encoder = new BASE64Encoder();
            String authString = name + ":" + password;
            String authStringEncoded = encoder.encode(authString.getBytes());
            setHeader("Proxy-Authorization", "Basic " + authStringEncoded);

也许,同样,您可以探测Apache实用程序以获得正确的编码用户名/密码

类似于以下伪代码:

Header  auth_header=
 new DigestScheme().authenticate(new UsernamePasswordCredentials(authUser.asString(),
                                                                 authPwd.asString()),
                                                       commonsHttpRequest,
                                                       new BasicHttpContext());

之后,只需:

urlConnection。setRequestProperty(“Authorization”,auth_header.getValue());

 类似资料:
  • 我试图通过Jedis客户端连接到redis服务器,但在连接时我得到了以下异常和堆栈跟踪- redisconnectionFailureException:无法获得Jedis连接;嵌套异常是redis.clients.jedis.exceptions.jedisconnectionException:无法从位于org.springframework.data.redis.connection.jed

  • 我正在使用另一个容器中的DockerizeSpring启动应用程序和redis。 我使用docker comush在同一个网络中运行两个容器,这是我的docker-compose.yml: 这是我的application.yml文件: 我也尝试了redis hots=redis,但结果是一样的。 我的问题是,我得到这个java.net.连接异常:拒绝连接(拒绝连接)”,即使容器在同一个网络中。 我

  • 我已部署storm server,但每次启动supervisor时都会收到以下错误。 谁能帮我纠正这个错误吗。提前谢谢

  • 问题内容: 我一直在尝试让一个简单的网络测试程序无法运行。 服务器: 客户: 当我使用127.0.0.1或我的内部IP作为主机名时,该程序运行良好。但是,每当我切换到外部IP地址时,都会引发错误。 我特意选择了一个不常见的端口,以查看是否是问题所在,但没有运气。使用telnet可以毫无问题地进行连接,但是当我尝试使用canyouseeme.org访问端口时,它表明连接超时。我什至尝试禁用所有防火墙

  • 问题内容: 我已经为RMI的客户端编写了以下代码。但是得到 代码: 问题答案: 如果要在绑定,重新绑定或查找时获取该注册表,则注册表不会运行。如果让它进行远程调用,请参阅Javadoc随附的RMI FAQ 中的项目A.1 ,如果您正在运行Linux,还请检查/ etc / hosts文件是否将127.0.0.1映射到localhost和您的真实IP地址。到您的真实主机名- 在某些Linux发行版中

  • 我试图用我自己的小Java客户端通过SSL发送一个SOAP请求,但它以“Java.net.connectException:Connection referend”失败。用SOAPUI发送的相同请求不会失败,我会从服务器得到有效的响应。 这是我试图运行的代码: 它以“java.net.ConnectException:Connection Referend”异常失败。当我使用SOAPUI从相同的W