4

ユーザーを識別するために GUID を使用して Cookie を追加しようとしていますが、コードをテスト スクリプトで実行しても Cookie が送信されないようです。

私のJavaコード:

    public void search(String q, int o) {
    final String query = q;
    final int offset = o;
    Thread searchThread = new Thread() {
        public void run() {
            try {
                DefaultHttpClient httpClient = new DefaultHttpClient();
                BasicHttpContext httpContext = new BasicHttpContext();
                CookieStore cookieStore = new BasicCookieStore();
                httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
                cookieStore.addCookie(new BasicClientCookie("remixsid", guid));
                httpClient.setCookieStore(cookieStore);
                HttpPost httpPost = new HttpPost("http://192.168.1.43/test/test.php?section=audio&q=" + URLEncoder.encode(query, HTTP.UTF_8) + "&offset=" + offset);
                //HttpPost httpPost = new HttpPost("http://vkontakte.ru/gsearch.php?section=audio&q=" + URLEncoder.encode(query, HTTP.UTF_8) + "&offset=" + offset);
                HttpResponse response = httpClient.execute(httpPost, httpContext);
                String responseBody = EntityUtils.toString(response.getEntity());
                System.out.print(responseBody);
            } catch(Exception e) {
                System.out.println(e.toString());
            }
        }
    };
    searchThread.run();
}

Cookie をテストするための私の PHP コード:

<?php
$cookies = $_COOKIE;

if(!count($cookies) > 0)
    echo 'No cookies!';

foreach ($cookies as $key=>$val)
    echo "$key--> $val";

?>

GUID は次のコードで取得されます。

    public void login(String usr, String pass) {
    logout();
    final String username = usr;
    final String password = pass;
    Thread loginThread = new Thread() {
        public void run() {
            try {
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost("http://login.vk.com/?act=login&email=" + URLEncoder.encode(username, HTTP.UTF_8) + "&pass=" + URLEncoder.encode(password, HTTP.UTF_8));
                httpClient.execute(httpPost);
                List<Cookie> cookies = httpClient.getCookieStore().getCookies();
                for(Cookie cookie : cookies) {
                    System.out.println("Cookie: " + cookie.toString());
                    if(cookie.getName().contains("remixsid"))
                        guid = cookie.getValue();
                }
            } catch(Exception e) {
                System.out.println(e.toString());
                System.out.println("An error occured");
                if(loginHandler != null)
                    loginHandler.onLoginError(e);
                return;
            }
            if(!isLoggedIn()) {
                System.out.println("User credentials invalid");
                if(loginHandler != null)
                    loginHandler.onLoginInvalidCredentials();
                return;
            }
            if(loginHandler != null)
                loginHandler.onLoginSuccess();
            System.out.println("Login successfull GUID is: " + guid);
        }
    };
    loginThread.start();
}
4

2 に答える 2

8

Cookieヘッダーを手動で設定するとうまくいくようです...

    public void search(String q, int o) {
    final String query = q;
    final int offset = o;
    Thread searchThread = new Thread() {
        public void run() {
            try {
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost("http://192.168.1.43/test/test.php");
                //HttpPost httpPost = new HttpPost("http://vkontakte.ru/gsearch.php?section=audio&q=" + URLEncoder.encode(query, HTTP.UTF_8) + "&offset=" + offset);
                httpPost.setHeader("Cookie", "remixsid=" + guid);
                HttpResponse response = httpClient.execute(httpPost);
                String responseBody = EntityUtils.toString(response.getEntity());
                System.out.println(responseBody);
            } catch(Exception e) {
                System.out.println(e.toString());
            }
        }
    };
    searchThread.start();
}
于 2012-06-02T15:18:54.663 に答える
2

いくつかのコメントと提案:

  1. Cookieにパス情報を追加していません。メソッドを使用できますBasicClientCookie.setPath()
  2. この Cookie を読み取ろうとしている php スクリプトのパスは何ですか?
  3. ルート パス( ) にCookie が設定されると、その Cookie/のみが他のすべてのサーバー側プログラムで使用できるようになります。
  4. Cookie のパスをルートに設定するか、Cookie のパスを PHP スクリプトのパスと同じにします。

編集:

ドメインの部分が抜けていました。Cookie ドメインも設定する必要があります。PHP スクリプトが次の場所で実行されていると仮定すると、ドメインは次のとおりです (ローカル ボックスでスクリプトを実行している場合はそうなる可能性がありhttp://mysite/myscript.phpます)。Cookie ドメインの設定に使用します。mysitelocalhostBasicClientCookie.setDomain()

これを理解するには、http-client lib が Web サイトと対話するブラウザーであると想定します。ブラウザは多くのサイトからの Cookie を保存しますが、特定のサイトにリクエストを送信している間、その特定のサイトから受け取った Cookie のみを送信します。

ドメインが設定されていない場合、lib はそのホストに Cookie を送信しません。

于 2012-06-02T05:37:25.517 に答える