如何通过@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
相关产品推荐
相关产品推荐

