如何基于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语句、传入参数是否符合预期,排查实体字段和表字段映射错误的问题
- 注册逻辑存密码时不要存明文,否则有数据泄露风险
- 如果调用DAO时拿不到Session,先检查事务配置是否正确,
内容的提问来源于stack exchange,提问作者Ramzan
相关产品推荐
相关产品推荐

