2

その部分まで(ユーザー名とパスワードを使用して)URLをヒットしているAndroidでログインアプリケーションを構築していますが、その後は(ユーザーが認証されると)URLをヒットするたびに何も返しません(つまり「最初にログインしてください」などのエラー メッセージ)。ただし、非常によく似たiPhoneアプリとブラウザでは問題なく動作します。

実際の問題が何であるかを理解できませんでした。サーバー側(つまり、phpコーディング)に問題がありますか、それともAndroidアプリに問題がありますか。同じiPhoneアプリとブラウザで問題なく動作するため、サーバー側のコーディングを実際に非難することはできません.

どんなアイデアや助けも高く評価されます。ありがとう。

4

3 に答える 3

5

Php スクリプトは、ブラウザ経由でサイトを閲覧するときに、セッション トークンを使用して訪問者を識別します。通常、PHPSESSID 変数に格納されます。

Android アプリケーションをサーバー側で認証したままにしたい場合は、最初の接続後にその ID をフェッチし、その後のすべてのリクエストのヘッダーで送信する必要があります。

**編集:**これはあなたがやりたいことです: Androidおよび/またはJavaでHttpClientを使用してCookieを管理するにはどうすればよいですか?

于 2011-05-10T09:34:47.223 に答える
1

アクティブなDefaultHttpClient接続を使用して、サーバー側で各モバイル要求に対して検証を行うことができます$_SESSION。ここに小さなサンプルコードがあります(本番用ではありません)

最初にクラスがあります:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

public class NetClient {

    private HttpClient client = null;

    public NetClient() {
        client = new DefaultHttpClient();
    }

    public String request(String url) throws ClientProtocolException, IOException {
        HttpPost post = new HttpPost(url);
        HttpResponse res = client.execute(post);

        BufferedReader br = new BufferedReader(new InputStreamReader(res.getEntity().getContent()));
        String data = "";
        String line = "";
        while ((line = br.readLine()) != null) {
             data = data + line;
        }
        return data;
    }

    public String login(String url) throws ClientProtocolException, IOException {
        HttpPost post = new HttpPost(url);

        ArrayList pa = new ArrayList();
        pa.add( new BasicNameValuePair( "username", "admin"));
        pa.add( new BasicNameValuePair( "password", "admin"));
        post.setEntity( new UrlEncodedFormEntity(pa, "UTF-8"));

        HttpResponse res = client.execute(post);

        BufferedReader br = new BufferedReader(new InputStreamReader(res.getEntity().getContent()));
        String data = "";
        String line = "";
        while ((line = br.readLine()) != null) {
             data = data + line;
        }
        return data;
    }
}

次にmainactivity.javaで

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

try {
    NetClient n = new NetClient();

    String k = n.login("http://x.com/testAREA/securetrans/login.php");
    Log.w("login result", k);

    String l = n.request("http://x.com/testAREA/securetrans/content.php");
    Log.w("ask if logged in", l);

} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

login.phpの場所

<?php
session_start();

if(isset($_POST['username']))
{
    $username = $_POST['username'];
    $password = $_POST['password'];

    if($username == 'admin' && $password == 'admin')
    {
        $_SESSION['username'] = $username;

        echo "admin setted";

        exit;
    }
    else
    {
        echo "-1";
    }
}
?>

およびcontent.phpとして:

<?php
session_start();

if(isset($_SESSION['username']))
{
    echo "login ok";
}
else
{
    echo "not login";
}
?>

このサンプル コードを実行すると、次のコードで終了します。

echo "login ok";

詳細: http://www.pipiscrew.com/2014/11/phpandroid-secure-connection-with-session-variable/

于 2014-11-09T14:18:45.537 に答える