2

我正在 android 中构建一个登录应用程序,在该应用程序中,我点击了一个 url(带有用户名和密码)到该部分它工作正常,但之后每当我点击一个 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 回答
0

我最近遇到过这种情况,当我们从 Android 访问 API 时,没有创建 PHP 会话。

花了一些时间后,我想通了。

要创建会话,您需要为 API 调用启用 cookie。您必须设置可以接受来自传入 HTTP 响应的 cookie 并为传出 HTTP 请求提供 cookie 的处理程序。

要启用 cookie,您必须cookieJarOkHttpClient.

import okhttp3.JavaNetCookieJar
import java.net.CookieManager

    val okHttpClient = OkHttpClient.Builder()
                .cookieJar(JavaNetCookieJar(CookieManager()))
                .build()
于 2020-05-09T16:13:54.653 回答