0

特定のページにログインしてナビゲーションを行う必要があるアプリケーションを構築しています。応答にそれを識別する文字列が含まれていれば、ログインできます。しかし、2 番目のページに移動すると、そのページはログイン ユーザーとして表示されず、匿名としてのみ表示されます。

私は自分のコードを提供します:

import java.net.*;
import java.security.*;
import java.security.cert.*;
import javax.net.ssl.*;
import java.io.*;
import java.util.*;

public class PostTest {
    static HttpsURLConnection conn = null;
    static String sessionId = null;
    private static class DefaultTrustManager implements X509TrustManager {

        @Override
        public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }

    public static void main(String[] args) {
        try {
            SSLContext ctx = SSLContext.getInstance("TLS");
            ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
            SSLContext.setDefault(ctx);


            String data = URLEncoder.encode("txtUserName", "UTF-8") + "=" + URLEncoder.encode(/*username*/, "UTF-8");
            data += "&" + URLEncoder.encode("txtPassword", "UTF-8") + "=" + URLEncoder.encode(/*password*/", "UTF-8");
            data += "&" + URLEncoder.encode("envia", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8");

            connectToSSL(/*login url*/);

                    //throws java.lang.IllegalStateException: Already connected
            conn.setDoOutput(true); 

            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(data);
            wr.flush();

            BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            String resposta = "";
            while((line = rd.readLine()) != null) {
                resposta += line + "\n";
            }
            System.out.println("valid login -> " + resposta.contains(/*string that assures me I'm looged in*/));

            connectToSSL(/*first navigation page*/);

            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            while((line = rd.readLine()) != null) {
                System.out.println(line);
            }


        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    private static void connectToSSL(String address) {
        try {
            URL url = new URL(address);
            conn = (HttpsURLConnection) url.openConnection();
            conn.setHostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String arg0, SSLSession arg1) {
                    return true;
                }
            });
                    if(sessionId == null) {
                            sessionId = conn.getHeaderField("Set-Cookie");
                    }
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }

}

詳細については、お尋ねください。

4

4 に答える 4

2

ではconnectToSSL、毎回新しい接続を開いています。2 番目の接続では、最初の接続の属性はありません。

最初のログイン接続後にいくつかのトークン/クッキー値を取得するように設定し、その後の呼び出しで同じものを使用することができます。

最初の接続後:

      String sessionId = conn.getHeaderField("Set-Cookie");

以降の接続では:

     conn.setRequestProperty("Cookie", sessionId );
于 2012-10-17T16:52:40.953 に答える
0

Apache Commons プロジェクトのHttpClientを見てください。あなたが達成しようとしていることを実行するのに役立ちます。URL クラスよりもはるかに複雑なものが必要になる場合があります。1 つの認証要求から後続の認証要求に移行するには、多くの情報を維持する必要があります。

于 2012-10-17T16:57:48.430 に答える
0

http はステートレス プロトコルです。状態(セッション)を保持するには、サーバーから受信したCookieを保存します。 List<String> cookies = conn.getHeaderFields().get("Set-Cookie");

後続のリクエストでそれらをサーバーに送信します

for (String cookie : cookies) {

//remove expires and path from cookie

String cookieValue=cookie.substring(0, cookie.indexOf(';'); conn.addRequestProperty("Cookie",cookieValue);
}

OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());

wr.write(data);

于 2012-10-17T17:08:23.650 に答える
0

あなたがアクセスしているサイトでは、おそらく Cookie を使用して、ログインしているセッションを識別しています。最初のリクエストで設定された Cookie を保存し、後続のリクエストで送信する必要があります。

HttpsUrlConnection を使用している場合は、Cookie の管理java.net.CookieManagerを参照してください。もう 1 つの選択肢は、デフォルトで Cookie 管理を行うApache HttpComponentsです。

于 2012-10-17T17:06:34.040 に答える