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

如何通过@Path与@PathParam传递两个参数?Java+AngularJS+MySQL认证问题

解决认证功能中多参数传递的问题

我帮你排查了代码里的问题,核心是REST接口的路径定义、参数绑定,还有前端URL拼接这几个地方出了问题,导致两个参数无法正确传递。下面一步步给你修正方案:

1. 修复后端Controller的问题

你的Controller里有两个关键错误:

  • Path路径没有用分隔符区分两个参数,{numerocompte}{mdp}会被当成一个路径段,后端无法拆分账号和密码
  • @PathParam的写法错误,不能把两个参数放在同一个注解里,必须分别标注

修改后的Controller代码:

@GET
@Path("authentifier/{numerocompte}/{mdp}")
@Produces(MediaType.APPLICATION_JSON)
public Client authentifier(@PathParam("numerocompte") int numerocompte, @PathParam("mdp") String mdp) {
    ClientDao dao = new ClientDao();
    System.out.println("收到的账号:" + numerocompte + ",密码:" + mdp);
    return dao.authentifier(numerocompte, mdp);
}

另外,@GET请求不需要@Consumes(MediaType.APPLICATION_JSON),因为GET请求一般不会携带请求体,直接去掉即可。

2. 修复前端AngularJS的请求拼接

你现在的URL拼接会把账号和密码直接连在一起(比如账号123+密码abc变成123abc),后端无法识别两个参数,需要加上分隔符/:

修改后的AngularJS代码:

$http.get('rest/client/authentifier/' + $scope.nouveauClient.numerocompte + '/' + $scope.nouveauClient.mdp)
.then(function(response) {
    console.log("认证返回结果:", response.data);
    // 用JSON.stringify才能把对象转成字符串显示在alert里
    alert(JSON.stringify(response.data));
});

3. 优化DAO层的代码(可选但推荐)

你的DAO里还有几个可以优化的点:

  • 当查询不到用户时,当前代码会返回一个空的Client对象(不是null),建议判断ResultSet是否有数据,没有的话返回null
  • 使用try-with-resources语法自动关闭数据库连接、Statement、ResultSet,避免资源泄漏

修改后的DAO代码:

public Client authentifier(int numerocompte, String mdp) {
    System.out.println("待验证账号:" + numerocompte + ",密码:" + mdp);
    // try-with-resources会自动关闭资源
    try (Connection con = Connexion.getConnection();
         PreparedStatement ps = con.prepareStatement("select * from client WHERE numerocompte = ? AND mdp = ?")) {
        ps.setInt(1, numerocompte);
        ps.setString(2, mdp);
        try (ResultSet rs = ps.executeQuery()) {
            // 只需要判断一次是否有结果(因为账号+密码应该唯一)
            if (rs.next()) {
                Client e = new Client();
                e.setIdclient(rs.getInt("idclient"));
                e.setNomcomplet(rs.getString("nomcomplet"));
                e.setMail(rs.getString("mail"));
                e.setNumerocompte(rs.getInt("numerocompte"));
                e.setMdp(rs.getString("mdp"));
                return e;
            } else {
                // 没有找到匹配的用户,返回null
                return null;
            }
        }
    } catch (Exception e) {
        System.out.println("Erreur avec authentifier() -->" + e.getMessage());
        return null;
    }
}

重要注意事项

  • 安全问题:用GET请求传递密码非常不安全,密码会暴露在URL、浏览器历史、服务器日志里,建议改用POST请求,把账号和密码放在请求体中传递
  • 密码不要明文存储在数据库里,应该存储加密后的哈希值(比如BCrypt),验证时对输入的密码进行哈希后再和数据库比对

内容的提问来源于stack exchange,提问作者A.Aou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:55:34