2

私のアプリケーションは、認証を取得するために複数の Web 呼び出しを行います。このセッションを Cookie に保存する必要があります。Cookie Manager を使用したかったのですが、調査を行った結果、API 9 以降でのみ使用可能であり、アプリケーションには下位互換性が必要であることがわかりました。

安全な HTTPS への HTTPURLConnection を使用して Web 接続を確立します。私のコードの簡単な例

    public String iStream_to_String(InputStream is)
{
    BufferedReader rd = new BufferedReader(new InputStreamReader(is), 4096);
    String line;
    StringBuilder sb = new StringBuilder();
    try
    {
        while ((line = rd.readLine()) != null)
        {
            sb.append(line);
        }
        rd.close();

    } catch (IOException e)
    {
        e.printStackTrace();
    }
    String contentOfMyInputStream = sb.toString();
    return contentOfMyInputStream;
}

final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier()
{
    public boolean verify(String hostname, SSLSession session)
    {
        return true;
    }
};

/**
 * Trust every server - dont check for any certificate
 */
private static void trustAllHosts()
{
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[]
    { new X509TrustManager()
    {
        public java.security.cert.X509Certificate[] getAcceptedIssuers()
        {
            return new java.security.cert.X509Certificate[]
            {};
        }

        public void checkClientTrusted(X509Certificate[] chain,
                String authType) throws CertificateException
        {
        }

        public void checkServerTrusted(X509Certificate[] chain,
                String authType) throws CertificateException
        {
        }
    } };

    // Install the all-trusting trust manager
    try
    {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection
                .setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}

それから私はそのように要求します

    try
    {
        url = new URL(url1);



        trustAllHosts();
           HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
       https.setHostnameVerifier(DO_NOT_VERIFY);
        http = https;

        InputStream in = new BufferedInputStream(http.getInputStream());

        sAuthenticateP1 = iStream_to_String(in);
        in.close();


    } catch (Exception e)
    {
        e.printStackTrace();
    }

完全な認証は 4 つのステップで行われます。4 つのステップ全体でセッションが記憶されるようにする必要があります。CookieManager を使用できないので、これを行う他の方法を探していましたが、見つからないようです。誰でも私を正しい方向に向けることができますか?

前もって感謝します!!

4

1 に答える 1

1

理解した。他の誰かが同様の問題を抱えている場合に備えて、コードの概要を簡単に説明します。前に言ったように、私のものはいくつかの段階の認証プロセスです。したがって、最初のリクエストの後、応答を受け取った後、次のようにクッキーを取得します

String cookie = http.getRequestProperty("Cookie");
            if (cookie != null && cookie.length() > 0)
            {
                sCookie = cookie;
                Log.v("cookie2", sCookie);
            }

sCookie は、私が設定した静的文字列変数です。次に、次のリクエストで、この行の後に

https = (HttpsURLConnection) url.openConnection(); 

置くだけ

            https.setRequestProperty("Cookie", sCookie);
            https.setRequestMethod("POST");
            https.setDoInput(true);
            https.setDoOutput(true);

その後、各リクエストに対して同じことを行い、その後セッションが必要になり、正常に動作するはずです

于 2012-05-09T12:29:31.497 に答える