1. 用户登录功能简介
用户输入用户名和密码,提交给后台数据库查询,如果存在对应的用户名和密码,则登录成功,跳转到系统的主页,即index.html页面;前端使用Jquery实现。
2. 用户登录-持久层
用户登录时,需要进行用户名密码的验证,因此需要按username查找用户,可以复用注册功能时编写的sql语句和对应接口。
3. 用户登录-业务层
1. 异常规划
登录时可能出现的异常有:用户不存在、密码错误,因此需要定义两个异常类:UserNotFoundException、PasswordErrorException,这两个异常类继承ServiceException类。
2. 业务层接口和抽象方法
- 在IUserService接口中编写抽象方法
public interface IUserService {
/*
用户注册方法,返回用户的数据对象
*/
void register(User user);
/*
用户登录,将当前登录成功的用户数据以用户对象的形式返回。
状态管理:可以将数据保存在cookie或者session中,可以避免频繁操作数据进行获取
(用户名、用户id存放在session中,用户头像存放在cookie中)
*/
User login(String username, String password);
}
- 在UserServiceImpl实现类中重写方法
注意点:
- 判断用户是否存在时,还需要判断用户是否被删除,即isDelete是否等于1
- 验证密码时需要将获得的密码进行MD5加密后再比较
- return User对象,辅助其他页面做数据展示使用
@Override
public User login(String username, String password) {
User user = userMapper.findByUsername(username);
//判断用户是否存在
if(user == null) {
throw new UserNotFoundException("用户不存在");
}
//判断用户是否被删除
if(user.getIsDelete() == 1) {
throw new UserNotFoundException("用户不存在");
}
//检测用户密码是否正确
//1.获取盐值并将前端密码进行MD5加密
String salt = user.getSalt();
String checkedPwd = getMD5Password(password, salt);
//2.从数据库获取该用户名对应的用户密码
String truePwd = user.getPassword();
//3.进行密码的比较
if(!truePwd.equals(checkedPwd)) {
throw new PasswordErrorException("用户密码错误,请重新输入");
}
//将当前用户的数据封装成一个新的数据,只保留uid,username,avatar三个属性值,提升系统性能
User result = new User();
result.setUsername(user.getUsername());
result.setUid(user.getUid());
result.setAvatar(user.getAvatar());
//将当前的用户数据返回,辅助其他页面做数据展示使用
return result;
}
4. 单元测试
分别输入正确的用户名密码、不存在的用户名和密码、存在的用户名和错误的密码进行测试:
@Test
public void login() {
User user = userService.login("Jerry", "222");
System.out.println(user);
}