我正在android中构建一个登录应用程序,我正在点击一个url(使用用户名和密码),直到该部分它工作正常,但在那之后每当我点击一个url(一旦用户通过身份验证),它就不会返回任何内容(即出现错误消息,请先登录)。 但它在非常相似的iPhone应用程序和浏览器上工作正常。
我无法理解实际问题是什么。服务器端是否有任何问题(即在PHP编码中)或Android应用程序有问题。我们实际上不能责怪服务器端编码,因为它适用于相同的iphone应用程序和浏览器。
任何想法或帮助都将受到高度赞赏。 感谢。
答案 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