Android登录注册报错:FtpURLConnection无法转为HttpURLConnection求助
解决java.lang.ClassCastException: FtpURLConnection cannot be cast to HttpURLConnection错误
这个错误的根源非常直接——你在Android代码里错误地使用了FTP协议的URL来创建HttpURLConnection,这两个类属于完全不同的协议实现,没有继承关系,自然没法强制转换。
具体问题点
看你Android代码里的这两行:
String urlRegistration = "ftp://remoteaddress/site/wwwroot/classes/LoginAndRegister-register.php"; String urlLogin = "ftp://remoteaddress/site/wwwroot/classes/LoginAndRegister-login.php";
HttpURLConnection只能处理http://或https://开头的HTTP/HTTPS协议地址,而你用了ftp://开头的FTP地址,系统会返回FtpURLConnection实例,强行转成HttpURLConnection就会抛出ClassCastException。
修复步骤
- 替换为HTTP/HTTPS协议的URL
把FTP地址改成你的PHP脚本在Web服务器上的可访问HTTP地址,比如你的网站域名是your-domain.com,那应该写成:
String urlRegistration = "http://your-domain.com/classes/LoginAndRegister-register.php"; String urlLogin = "http://your-domain.com/classes/LoginAndRegister-login.php";
先确保这个URL在浏览器里能正常打开,返回预期的内容,再让Android端请求它。
额外的优化建议(避免后续踩坑)
- *替换废弃的mysql_函数
你PHP代码里用的mysql_*函数已经被PHP官方废弃多年,在PHP7+版本中已经被移除,建议换成mysqli_*扩展:
- 连接数据库的代码修改:
<?php $hostname = "us-cdbr-azure-southcentral-f.cloudapp.net"; $username = "XXXXX"; $dbname = "db"; $password = "word"; // 使用mysqli_connect替代mysql_connect $conn = mysqli_connect($hostname, $username, $password, $dbname); if(!$conn){ die("Connection failed: " . mysqli_connect_error()); } ?>
- 登录处理代码修改(同时修复SQL注入风险):
<?php require "LoginAndRegister-connection.php"; $user_email = mysqli_real_escape_string($conn, $_POST["identifier_loginEmail"]); // 注意:如果数据库存的是sha1加密的密码,这里要先加密再比对 $user_pass = sha1($_POST["identifier_loginPassword"]); $user_pass = mysqli_real_escape_string($conn, $user_pass); $mysql_query = "SELECT * FROM usuarios WHERE email = '$user_email' AND senha = '$user_pass'"; $result = mysqli_query($conn, $mysql_query); if(mysqli_num_rows($result)>0){ $row = mysqli_fetch_assoc($result); $name = $row["name"]; $email = $row["email"]; echo "true,".$email.",".$name; } else{ // 返回固定格式的失败响应,避免Android端split数组越界 echo "false,,,"; } ?>
统一响应格式
你当前登录失败时返回的字符串"Login was not successful... :(",在Android端用逗号分割会导致数组长度不足3,进而抛出数组越界异常。建议统一返回"true,email,name"或"false,,,"的格式,保证split(",")后始终得到3个元素。密码加密一致性
你注释提到密码用sha1()加密,但Android端是直接传输明文密码,PHP端需要对接收的密码做sha1()加密后再和数据库存储的密文比对,否则登录会失败。
内容的提问来源于stack exchange,提问作者cthulhu
相关产品推荐
相关产品推荐

