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

如何基于Spring MVC与Hibernate实现登录功能

Spring MVC 整合 Hibernate 实现登录读库逻辑

以下是完整可落地的实现步骤,前提是你已经完成Spring MVC、Hibernate与MySQL的基础连接配置、实体扫描、事务配置。

  • 第一步:映射用户实体类
    先创建和MySQLuser表对应的实体类,字段和表字段一一对应:
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "username", unique = true, nullable = false, length = 32)
    private String username;

    @Column(name = "password", nullable = false, length = 64)
    private String password;

    // 自行补全所有字段的getter、setter方法
}
  • 第二步:实现DAO层查询逻辑
    通过Hibernate Session构造HQL查询,根据传入的用户名查询库中匹配的用户记录,必须用参数绑定写法,禁止拼接字符串,避免SQL注入:
@Repository
public class UserDao {
    @Autowired
    private SessionFactory sessionFactory;

    public User getUserByUsername(String username) {
        Session session = sessionFactory.getCurrentSession();
        String hql = "FROM User WHERE username = :uname";
        return session.createQuery(hql, User.class)
                .setParameter("uname", username)
                .uniqueResult();
    }
}

这里用uniqueResult()的前提是你给username字段加了唯一索引,查询结果最多只有1条,不会抛出多结果的异常。

  • 第三步:实现Service层登录校验逻辑
    不要直接把密码放到查询条件里,先查出对应用户,再做密码比对,后续升级密码加密逻辑时不需要改DAO层代码:
@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    public boolean verifyLogin(String username, String inputPassword) {
        User dbUser = userDao.getUserByUsername(username);
        // 用户名不存在直接返回校验失败
        if (dbUser == null) {
            return false;
        }
        // 生产环境请替换为BCrypt等加密算法的密文比对,禁止明文存储、比对密码
        return dbUser.getPassword().equals(inputPassword);
    }
}
  • 第四步:编写Controller层登录入口
    接收前端提交的登录参数,调用Service校验后处理跳转逻辑:
@Controller
@RequestMapping("/account")
public class LoginController {
    @Autowired
    private UserService userService;

    @PostMapping("/login")
    public String handleLogin(@RequestParam String username,
                              @RequestParam String password,
                              HttpSession session,
                              Model model) {
        boolean isPass = userService.verifyLogin(username, password);
        if (isPass) {
            session.setAttribute("currentUser", username);
            return "redirect:/home";
        }
        model.addAttribute("loginError", "用户名或密码错误");
        return "loginPage";
    }
}
  • 常见问题排查
    • 如果调用DAO时拿不到Session,先检查事务配置是否正确,sessionFactory是否正确注入,hibernate.current_session_context_class配置是否和Spring事务适配
    • 查不到数据时,打开Hibernate的SQL打印配置,看生成的SQL语句、传入参数是否符合预期,排查实体字段和表字段映射错误的问题
    • 注册逻辑存密码时不要存明文,否则有数据泄露风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:03:25