【问题标题】:Trying to verify password via JSONarray in android尝试通过Android中的JSONarray验证密码
【发布时间】:2014-09-23 15:13:08
【问题描述】:

自从我上次尝试申请以来已经太久了,在我的一生中,我自己似乎无法得到答案。我需要让用户在登录时在我的应用程序中输入密码和用户名,我想通过在 PHP Myadmin 中搜索数据库来做到这一点。

我的代码已经达到了(我认为)应该接近完成的水平,但逻辑却让我无法理解。

我需要计算 if 语句来比较用户通过 JSONArray 输入到数据库的用户名和密码,此外,如果代码无论如何都不起作用,将不胜感激:)

if 语句标有 ----> 我知道我需要某种形式的 for 循环来筛选和比较值,但这是我从未处理过的事情。

这是我的登录屏幕的代码:

    public class HomeScreen extends Activity implements OnClickListener {

    private ProgressDialog m_ProgressDialog = null;


    EditText editText1;
    EditText editText2;
    String clear1;
    String user;
    String password;
    URL url;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home_screen);

        View loginBTN = findViewById(R.id.button1);
        loginBTN.setOnClickListener(this);

        editText1=(EditText)findViewById(R.id.editText1);
        editText2=(EditText)findViewById(R.id.editText2);
        clear1 ="";
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.home_screen, menu);
        return true;
    }

public void onClick(View v) {

        switch (v.getId()) {
            case R.id.button1:

                user = editText1.getText().toString();
                password = editText2.getText().toString();

                if  ( editText1 != null && editText1.length() != 0 && editText2 != null && editText2.length() != 0){    
                    getData();
                    m_ProgressDialog = ProgressDialog.show(HomeScreen.this,    
                              "Please wait...", "Checking Details...", true);
                        m_ProgressDialog.setCancelable(true);

                     if(testData()) {
                        Intent i = new Intent(this, Afterlog.class);
                        startActivity(i);       
                    }

                    else{
                        Toast.makeText(HomeScreen.this, "The username and password did not match any in our database...", Toast.LENGTH_SHORT).show();   
                    }
                }
                else {
                    Toast.makeText(HomeScreen.this, "Please enter a user name AND a password...", Toast.LENGTH_SHORT).show();
                }
                break;

}
}


private static String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
      sb.append((char) cp);
        }
    return sb.toString();
}

public static JSONArray readJsonFromUrl(String url) throws IOException, JSONException {
InputStream is = new URL(url).openStream();
try {
  BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
  String jsonText = readAll(rd);
  JSONArray json = new JSONArray(jsonText);
  return json;
} finally {
  is.close();
}
}

    public void getData() {

    try{

        json = readJsonFromUrl("http://localhost/indextest.php?function=getdata");

        Thread.sleep(1000);
      } catch (Exception e) {
        Log.e("BACKGROUND_PROC", e.getMessage());
      }


}

public boolean testData() {
    getData();
    user = editText1.getText().toString();
    password = editText2.getText().toString();  

    for (int i = 0; i < json.length(); i++) {
        JSONObject currentObject = json.getJSONObject(i);
        if (currentObject.getString("username", "").equals(user) && currentObject.getString("password", "").equals(password))
            return true;
    }
    return false;
}

【问题讨论】:

  • 我在你的其他question上给了你一个答案,请回复我

标签: java android json getjson arrays


【解决方案1】:

您想验证用户身份吗?如果是这样,那么我认为这不是正确的方法。您应该将用户名和密码发送到服务器(可能是加密的),然后服务器会检查用户名和密码是否匹配,并会回复您一个简单的 JSON,例如:

{
     response: 1
}

表示认证成功(否则为0,例如)。

如果您只想从 JSON 对象获取数据,我建议您将 JSONArrayObject 更改为 JSONObject 并从中检索数据,您可以这样做:

JSONObject json = getData(); // getData now returns a JSONObject
String username = json.getString ("username");

我假设 JSON 格式如下:

{
    username: "Foo",
    password: "123"
}

//// 编辑--------------------------------

您可以让您的 getDate 函数检查它是否已经匹配,如果匹配则返回 true 或 false。像这样:

public boolean getDate() {
     // Get your data and put it into a JSONArray

     for (int i = 0; i < json.length(); i++) {
         JSONObject currentObject = json.getJSONObject(i);
         if (currentObject.getString("username").equals(user) && currentObject.getString("password").equals(password))
             return true;
     }
     return false;
}

你的 JSON 必须是这样的:

 [
     {
         username: "Foo1",
         password: "123"
     },
     {
         usernmae: "Foo2",
         password: "123"
     }, ...
 ]

那么你的 if 就是:

if(getData()) {
    Intent i = new Intent(this, Afterlog.class);
    startActivity(i);       
}

【讨论】:

  • 我认为这也是解决方案,但是以我的零技能组合,它是一个示例应用程序,我只是在玩,所以整个表将包含两个或三个名字,只是为了显示功能。 :)
  • 好的,所以您将把整个表(2 或 3 个用户)检索到应用程序,然后检查其中一些是否匹配。是吗?
  • 正确,只需循环数组或某种类型,我想我可以在 getData() 函数中执行此操作,然后如果它匹配则返回一个值,我可以使用 if 检查?
  • 看起来它应该可以工作,唯一的问题是 getString(String) 函数出现错误。而且我不知道如何解决它。
  • 这一行有多个标记 - JSONObject 类型中的方法 getString(String) 不适用于参数 (String, String) - JSONObject 类型中的方法 getString(String) 不适用于参数(字符串,字符串)
【解决方案2】:

您应该只将用户名和密码发送到 API。 API 然后将检查数据库,然后它应该向客户端应用程序返回一个状态 - 成功或失败。

将敏感信息(如密码)发送回客户端应用程序然后循环遍历值以进行比较不是一个好习惯。

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2017-03-14
      • 2014-07-26
      • 2012-04-18
      • 2013-07-31
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多