You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

修复步骤

  1. 替换为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端请求它。

额外的优化建议(避免后续踩坑)

  1. *替换废弃的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,,,";
}
?>
  1. 统一响应格式
    你当前登录失败时返回的字符串"Login was not successful... :(",在Android端用逗号分割会导致数组长度不足3,进而抛出数组越界异常。建议统一返回"true,email,name"或"false,,,"的格式,保证split(",")后始终得到3个元素。

  2. 密码加密一致性
    你注释提到密码用sha1()加密,但Android端是直接传输明文密码,PHP端需要对接收的密码做sha1()加密后再和数据库存储的密文比对,否则登录会失败。

内容的提问来源于stack exchange,提问作者cthulhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:41:29