【问题标题】:php session destroyed in android applicationphp会话在android应用程序中被破坏
【发布时间】:2011-08-22 07:45:47
【问题描述】:

我正在 android 中构建一个登录应用程序,在该应用程序中,我点击了一个 url(带有用户名和密码)直到该部分它工作正常,但之后每当我点击一个 url(一旦用户通过身份验证),它什么都不返回(即,请先登录之类的错误消息)。 但是它在非常相似的 iphone 应用程序和浏览器上运行良好。

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

任何想法或帮助将不胜感激。 谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    要启用 cookie,您必须在 OkHttpClient 中添加 cookieJar。

    import okhttp3.JavaNetCookieJar
    import java.net.CookieManager
    
        val okHttpClient = OkHttpClient.Builder()
                    .cookieJar(JavaNetCookieJar(CookieManager()))
                    .build()
    

    【讨论】:

      【解决方案2】:

      您可以使用活动的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/

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 你的意思是我必须发送带有 URL 的唯一 ID 以供进一步请求。
        • 没错,这样你的服务器就会知道它需要获取哪个会话来查看用户是否经过身份验证。它实际上是一个 cookie,通常您需要在每个请求中重新发送。看看这里:stackoverflow.com/questions/3587254/…
        • 但有一件事,同样的事情在浏览器和 iphone 上工作。那么,这个问题是否仅适用于 android 以及为什么。能给个思路吗?
        • 因为在浏览器上,也可能在您的 iphone(我猜是浏览器)上,浏览器实际上通过使用 cookie 为您处理 php 会话的传递,cookie 会在标题中自动发送到服务器请求。
        • 谢谢,我明白了你的意思,但你能告诉我如何在 android 中处理。
        猜你喜欢
        • 2013-10-31
        • 2016-04-28
        • 1970-01-01
        • 2023-03-04
        • 2014-08-14
        • 1970-01-01
        • 2019-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多