2

プロキシ経由でURL接続を行おうとすると、このエラーが発生します

java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 405 Method Not Allowed"
    at sun.net.www.protocol.http.HttpURLConnection.doTunneling(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)
    at com.test.sslpost.main(sslpost.java:81)

接続を開くときにエラーが発生します。プロキシを使用しない場合は正常に機能します。

以下に説明するJavaコードを参照してください

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.URL;
import java.net.URLEncoder;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class sslpost {
    public static void main(String[] args) {
        try {
            TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                public void checkClientTrusted(
                        java.security.cert.X509Certificate[] certs, String authType) {
                }

                public void checkServerTrusted(
                        java.security.cert.X509Certificate[] certs, String authType) {
                }
            } };

            try {

                SSLContext sc = SSLContext.getInstance("SSL");
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
                HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.setProperty("https.proxySet", "true");
            System.setProperty("https.proxyHost", "xxx.xxx.xxx.xxx");
            System.setProperty("https.proxyPort", "80");
            URL url = new URL("https://www.google.com");
            @SuppressWarnings("deprecation")
            HttpsURLConnection connection = (HttpsURLConnection) url
                    .openConnection();
            connection.setDoInput(true);
            connection.setDoOutput(true);

            connection.setRequestMethod("POST");
            connection.setFollowRedirects(true);

            String query = "serviceId="
                    + URLEncoder.encode("7");

            connection.setRequestProperty("Content-length",
                    String.valueOf(query.length()));
            connection.setRequestProperty("Content-Type",
                    "application/x-www- form-urlencoded");
            connection.setRequestProperty("User-Agent",
                    "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)");

            DataOutputStream output = new DataOutputStream(
                    connection.getOutputStream());

            output.writeBytes(query);

            System.out.println("Resp Code:" + connection.getResponseCode());
            System.out.println("Resp Message:"
                    + connection.getResponseMessage());

            DataInputStream input = new DataInputStream(
                    connection.getInputStream());

            for (int c = input.read(); c != -1; c = input.read())
                System.out.print((char) c);
            input.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
4

4 に答える 4

1

HTTPSはデフォルトでポート443を使用しますが、HTTPはデフォルトでポート80を使用します。

あなたのコードにはこれがあります

 System.setProperty("https.proxyPort", "80");

おそらくそれを80ではなく443に設定してみてください

于 2012-04-22T06:24:08.667 に答える
1

「super.doGet(req、resp);」と呼びましたか あなたのコードで?以下のように?

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    super.doGet(req, resp);

super.doGetの実装を確認すると、以下のコードが見つかります。

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String protocol = req.getProtocol();
    String msg = lStrings.getString("http.method_get_not_supported");
    if (protocol.endsWith("1.1")) {
        resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
    } else {
       resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
    }
}
于 2013-05-17T08:55:20.993 に答える
0

コードを変更する必要はないと思います。これは、プロキシサーバーがトンネリングできないことを意味します

別のhttpsプロキシで試す必要があります...

systemProp.https.proxyHost=""

systemProp.https.proxyPort=""

systemProp.https.proxyPassword=""

systemProp.https.proxyUser=""  
于 2012-04-22T06:52:01.387 に答える
0

開くと、プロキシ設定を含むファイルC:\Users\yourUsername\.gradleが見つかる場合があります。Gradle.buildファイルを削除して再試行してください。ファイルが見つからない場合は、インターネット接続の問題である可能性があります

于 2021-08-15T17:55:31.363 に答える