php сессия уничтожена в приложении Android

Я создаю приложение для входа в Android, в котором я нажимаю URL (с именем пользователя и паролем) до этой части, он работает нормально, но после этого всякий раз, когда я нажимаю URL (после аутентификации пользователя), он ничего не возвращает (т.е. сообщение об ошибке, как пожалуйста, войдите сначала). Однако он отлично работает в очень похожем приложении для iPhone и в браузере.

Я не мог понять, что является актуальной проблемой. Есть ли какие-либо проблемы на стороне сервера (т.е. в кодировании php) или что-то не так с приложением для Android. На самом деле мы не можем винить кодирование на стороне сервера, потому что оно отлично работает для того же приложения на iphone и в браузере.

Любая идея или помощь будут высоко оценены. Благодарю.

2 ответа

Решение

Ваш скрипт Php использует маркер сеанса для идентификации посетителя, когда вы просматриваете сайт через браузер. Обычно он хранится в переменной PHPSESSID.

Если вы хотите, чтобы ваше приложение Android оставалось аутентифицированным на стороне сервера, вам нужно получить этот идентификатор после первого подключения, а затем отправить его в заголовках всех ваших последующих запросов.

** РЕДАКТИРОВАТЬ: ** Это то, что вы хотите сделать: как мне управлять файлами cookie с помощью HttpClient в Android и / или Java?

Я столкнулся с этим совсем недавно, сеанс PHP не создавался, когда мы запускали API из Android.

Потратив некоторое время, я понял это.

Для создания сеансов вам необходимо включить файлы cookie для вызова API. вам необходимо настроить обработчик, который может принимать файлы cookie из входящих HTTP-ответов и предоставлять cookie для исходящих HTTP-запросов.

Для включения файлов cookie вам необходимо добавить cookieJar в твоем OkHttpClient.

import okhttp3.JavaNetCookieJar
import java.net.CookieManager

    val okHttpClient = OkHttpClient.Builder()
                .cookieJar(JavaNetCookieJar(CookieManager()))
                .build()

Вы можете использовать активный 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/

Другие вопросы по тегам