php会话在android应用程序中销毁

时间:2011-05-10 09:28:38

标签: php android session session-timeout session-state-server

我正在android中构建一个登录应用程序,我正在点击一个url(使用用户名和密码),直到该部分它工作正常,但在那之后每当我点击一个url(一旦用户通过身份验证),它就不会返回任何内容(即出现错误消息,请先登录)。 但它在非常相似的iPhone应用程序和浏览器上工作正常。

我无法理解实际问题是什么。服务器端是否有任何问题(即在PHP编码中)或Android应用程序有问题。我们实际上不能责怪服务器端编码,因为它适用于相同的iphone应用程序和浏览器。

任何想法或帮助都将受到高度赞赏。 感谢。

3 个答案:

答案 0 :(得分:5)

当您通过浏览器浏览网站时,您的Php脚本使用会话令牌来识别访问者。通常它存储在PHPSESSID变量中。

如果您希望Android应用程序在服务器端保持身份验证,则需要在第一次连接后获取该ID,然后将其发送到所有后续请求的标头中。

**编辑:**这就是你想要做的事:How do I manage cookies with HttpClient in Android and/or Java?

答案 1 :(得分: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/

答案 2 :(得分:0)

我最近遇到了这个问题,当我们从Android中访问API时,并未创建PHP会话。

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

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

要启用Cookie,您必须在let path = "some/path/with/unknown/depth"; let result = path.split('/').reverse()[0] console.log(result);中添加cookieJar

OkHttpClient