1、业务层:业务层中可以定义需要的接口、impl文件夹下的实现,以及自定义预测会产生的异常。
①业务层中的接口依然只需要定义方法名、返回值、接受的参数
public interface IUserService {
void reg(User user);
}
②为了区分项目运行过程中的异常类型,需要自定义一个异常的基类,由它来继承RuntimeExpection。接下来再自定义具体的异常来继承这个基类异常。基类异常和子类异常均需要重写运行时异常中的方法用于接收参数和输出。
public class ServiceException extends RuntimeException{
public ServiceException() {
super();
}
public ServiceException(String message) {
super(message);
}
public ServiceException(String message, Throwable cause) {
super(message, cause);
}
public ServiceException(Throwable cause) {
super(cause);
}
protected ServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
③接口中的方法在实现类中重写,同时实现类必须要继承相应的接口。实现类需要加注解@Service表示该类是一个业务层类,将当前类的对象交给spring管理,自动创建对象和对象的维护。异常在重写方法后,可以在实现类中实现传入参数并抛出异常。
@Service //将当前类的对象交给spring管理,自动创建对象以及对象的维护
public class UserServiceImpl implements IUserService {
@Autowired
private UserMapper userMapper;
@Override
public void reg(User user) {
//通过user参数获取传递的username
String username = user.getUsername();
//调用findByUsername判断用户是否被注册过
User result = userMapper.findByUsername(username);
//判断结果集,不为null则抛用户名被占用的异常
if(result != null){
//抛出异常
throw new UsernameDuplicatedException("用户名被占用");
}
//密码加密处理,md5算法
//串+password+串 连续加密三次
//串=盐值=随机的字符串
String oldPassword = user.getPassword();
//随机生成一个盐值
String salt = UUID.randomUUID().toString().toUpperCase();
//将密码和盐值作为一个整体加密处理
String md5Password = getMd5Password(oldPassword,salt);
//将加密后的密码重新设置到user
user.setPassword(md5Password);
//将盐值存到user
user.setSalt(salt);
//补全数据,用户信息创建人和时间
user.setIsDelete(0);
user.setCreatedUser(user.getUsername());
user.setModifiedUser(user.getUsername());
Date date = new Date();
user.setCreatedTime(date);
user.setModifiedTime(date);
//执行注册业务功能,当rows=1插入成功
Integer rows = userMapper.insert(user);
if(rows != 1){
throw new InsertException("用户注册过程中产生了未知的异常");
}
}
//定义一个md5算法加密处理
private String getMd5Password(String password,String salt){
for (int i = 0;i<3;i++){
password = DigestUtils.md5DigestAsHex((salt + password + salt).getBytes()).toUpperCase();
}
return password;
}
}
2、MD5算法加密:MD5算法是将密码构造为“随机字符串+密码+随机字符串”,再将新密码进行加密处理,将来程序接受到用户输入密码时会自动构造为“随机字符串+密码+随机字符串”并加密后与数据库中的加密密码做对比。
①使用方法UUID.randomUUID().toString();可以生成随机字符串
②使用方法UUID.randomUUID().toString().replace("-", "");可以生成不含“-”与“”的字符串
③使用方法UUID.randomUUID().toString().toUpperCase();可以生成字符串再转换为大写
④方法getBytes()可以将字符串转换为操作系统默认的字节数组
⑤方法DigestUtils.md5DigestAsHex()可以加密输入的字符串,是MD5加密算法的关键方法
3、测试业务类方法:
①需要测试的接口必须自动装配一个对象
②因为测试的方法中有异常的处理,所以可以加try、catch环绕。
③getClass()该方法返回对象运行时的类
④getSimpleName()方法获得类的简写名称,getName()方法返回类的详细路径
⑤getMessage()方法用类对象调用,返回异常信息