2011-05-10 128 views
1

我在android中創建了一個登錄應用程序,在該應用程序中,我點擊了一個url(使用用戶名和密碼)直到該部分工作正常,但之後,當我點擊一個url(一旦用戶認證),它不會返回任何內容(例如,請先登錄的錯誤消息)。 但是,它在非常類似的iPhone應用程序和瀏覽器中正常工作。在Android應用程序中銷燬的PHP會話

我不明白什麼是實際問題。服務器端是否存在問題(即在PHP編碼中)或者Android應用程序出現問題。我們實際上不能指責服務器端編碼,因爲它適用於相同的iphone應用程序和瀏覽器。

任何想法或幫助將不勝感激。 謝謝。

回答

5

當您通過瀏覽器瀏覽網站時,您的PHP腳本使用會話令牌來標識訪問者。它通常存儲在一個PHPSESSID變量中。

如果您希望您的Android應用程序在服務器端保持身份驗證,您需要在第一次連接後獲取該ID,然後將其發送到所有後續請求的頭文件中。

**編輯:**這是你想要做什麼:How do I manage cookies with HttpClient in Android and/or Java?

+0

你的意思是我要發送的唯一ID的URL進行進一步的要求。 – 2011-05-10 09:38:35

+0

確切地說,你的服務器將知道它需要獲取什麼會話以查看用戶是否已通過身份驗證。這通常是一個cookie,您需要重新發送每個請求。看看這裏:http://stackoverflow.com/questions/3587254/how-do-i-manage-cookies-with-httpclient-in-android-and-or-java – Yahel 2011-05-10 09:49:27

+0

但有一件事,同樣的事情工作在瀏覽器和iPhone上。所以,這個問題只針對android和爲什麼。你能提出一些想法嗎? – 2011-05-10 09:51:47

1

您可以使用Active 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"; 
    } 
} 
?> 

and 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/