Spring Data中字符串比较始终返回false问题求助
问题分析:PostgreSQL+Spring Data中字符串==比较返回false的原因及解决办法
核心问题
你在login()方法中用==比较两个字符串,这是在比较对象的引用地址,而非字符串的实际内容。从数据库查询返回的user.getUsername()是堆内存中新建的字符串实例,和请求传入的username实例不是同一个对象——哪怕内容完全一致,==也会返回false。
代码中的问题点
你的login()方法里这行代码是关键错误:
return (user.getUsername()==username);
解决办法
Java中比较字符串内容必须用equals()方法,以下是几种安全的写法:
- 直接调用
equals()(注意:若user.getUsername()可能为null,会抛出空指针异常):
return user.getUsername().equals(username);
- 把传入的非空字符串放前面(避免空指针,因请求参数
username是必填项,不会为null):
return username.equals(user.getUsername());
- 使用
Objects.equals()(Java 7+支持,自动处理null情况):
import java.util.Objects; // ... public boolean login(String username, String password) { Useraccount user = userRepository.findByUsername(username).orElseThrow(() -> new IllegalStateException("User with Username "+username+" not found")); System.out.println(user.getUsername()+user.getPassword()+"out"); System.out.println(username+password+"in"); return Objects.equals(user.getUsername(), username); }
额外提醒
实际生产环境中,绝对不能明文存储和比较密码。应该存储密码的哈希值(比如用BCrypt、Argon2等算法),登录时对传入的密码进行哈希后再和数据库中的哈希值比较,避免泄露风险。
内容的提问来源于stack exchange,提问作者Deonisos69
相关产品推荐
相关产品推荐

