Android登录注册页面异常:错误凭证仍登录+JSONException报错
问题分析与解决方案
我来帮你梳理并解决你遇到的两个核心问题:输入错误账号密码仍跳转页面,以及org.json.JSONException: No value for res_response异常。
1. 错误账号密码仍跳转页面的原因与修复
问题根源
在MainActivity的登录按钮点击事件中,你发起网络请求compare_version()后,没有等待服务器返回响应,直接执行了页面跳转代码:
else { Intent i = new Intent(MainActivity.this,Userlist.class); startActivity(i); }
网络请求是异步操作,这段代码会在请求发出后立刻执行,完全忽略了服务器返回的验证结果。
修复方案
把页面跳转逻辑移到网络请求的onResponse回调中,根据服务器返回的真实resp_code判断是否登录成功:
btnSignIn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final String name = username.getText().toString().trim(); final String pass = passwordd.getText().toString().trim(); // 先做输入合法性验证,再发起请求 if (TextUtils.isEmpty(name)) { username.setError("Please enter username"); username.requestFocus(); return; } if (TextUtils.isEmpty(pass)) { passwordd.setError("Please enter your Password"); passwordd.requestFocus(); return; } // 验证通过后发起登录请求 compare_version(); } });
然后修改compare_version()方法,根据服务器返回的状态码处理跳转:
private void compare_version() { JSONObject parameters = new JSONObject(); try { parameters.put("type", "userlogin"); parameters.put("username", username.getText().toString()); parameters.put("password", passwordd.getText().toString()); } catch (JSONException e) { e.printStackTrace(); // 不要吞掉异常,方便调试 } JsonObjectRequest req = new JsonObjectRequest(Request.Method.POST, url, parameters, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { JSONObject jsonObject = response; // 不要硬覆盖resp_code!使用服务器返回的真实状态码 String resp_code = jsonObject.getString("resp_code"); // 先判断字段是否存在,避免JSONException String resp_msg = jsonObject.has("res_response") ? jsonObject.getString("res_response") : "Unknown error"; System.out.println("response version =====" + response); if (resp_code.equals("200")) { // 用equals替代compareTo更直观 Toast.makeText(MainActivity.this, "Login successful: " + resp_msg, Toast.LENGTH_SHORT).show(); // 登录成功才跳转 Intent i = new Intent(MainActivity.this,Userlist.class); startActivity(i); } else { Toast.makeText(MainActivity.this, "Login failed: " + resp_msg, Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "Parse response failed", Toast.LENGTH_SHORT).show(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.e("Error: ", error.getMessage()); Toast.makeText(MainActivity.this, "Network error", Toast.LENGTH_SHORT).show(); } }); MyApplication.getInstance().addToRequestQueue(req); }
2. JSONException: No value for res_response的解决
问题根源
当输入错误账号密码时,服务器返回的JSON数据中可能不存在res_response字段,或者字段名拼写与服务器返回不一致(比如服务器实际返回的是resp_response)。同时你之前硬写resp_code = "200"会覆盖服务器返回的错误状态码,导致无法正确处理失败场景。
修复方案
- 在获取字段前,先用
jsonObject.has("res_response")判断字段是否存在,避免直接调用getString()抛出异常; - 不要手动覆盖
resp_code,保留服务器返回的真实状态码; - 确认服务器接口文档,确保字段名完全匹配(比如检查是
res_response还是resp_response)。
3. 注册页面的额外优化
Registration中按钮点击事件的输入验证顺序错误:你先调用了compare_version()发起请求,再做输入合法性检查,这会导致无效输入也会发送请求。调整顺序:
btnRegister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final String name = username.getText().toString().trim(); final String emaill = email.getText().toString().trim(); final String passwordd = password.getText().toString().trim(); final String mobilee = mobile.getText().toString().trim(); // 先做所有输入验证 if (TextUtils.isEmpty(name)) { username.setError("Please enter username"); username.requestFocus(); return; } if (TextUtils.isEmpty(emaill)) { email.setError("Please enter your email"); email.requestFocus(); return; } if (!android.util.Patterns.EMAIL_ADDRESS.matcher(emaill).matches()) { email.setError("Enter a valid email"); email.requestFocus(); return; } if (TextUtils.isEmpty(passwordd)) { password.setError("Enter a password"); password.requestFocus(); return; } if (TextUtils.isEmpty(mobilee)) { mobile.setError("Enter a mobile number"); mobile.requestFocus(); return; } // 验证通过后再发起注册请求 compare_version(); Log.e("TAG","Message"); } });
同时,注册的compare_version()方法也需要添加字段存在判断,避免同样的JSONException:
private void compare_version() { JSONObject parameters = new JSONObject(); try { parameters.put("type", "signup"); parameters.put("username", username.getText().toString()); parameters.put("email", email.getText().toString()); parameters.put("mobileno", mobile.getText().toString()); parameters.put("password", password.getText().toString()); } catch (JSONException e) { e.printStackTrace(); } JsonObjectRequest req = new JsonObjectRequest(Request.Method.POST, url, parameters, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { JSONObject jsonObject = response; String resp_code = jsonObject.getString("resp_code"); String resp_msg = jsonObject.has("res_response") ? jsonObject.getString("res_response") : "Registration failed"; System.out.println("response version =====" + response); if (resp_code.equals("200")) { Toast.makeText(Registration.this, "Registration successful: " + resp_msg, Toast.LENGTH_SHORT).show(); // 注册成功后可以跳转回登录页面 finish(); } else { Toast.makeText(Registration.this, "Registration failed: " + resp_msg, Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { e.printStackTrace(); Toast.makeText(Registration.this, "Parse response failed", Toast.LENGTH_SHORT).show(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.e("Error: ", error.getMessage()); Toast.makeText(Registration.this, "Network error", Toast.LENGTH_SHORT).show(); } }); MyApplication.getInstance().addToRequestQueue(req); }
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

