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/