自定义异常---密码的加密处理
一、自定义异常
java提供的异常太过笼统,因此需要自定义异常
- 比如,在业务层产生的异常,可以创建一个业务层异常的基类ServiceException,并继承RuntimeException类,并从父类生成子类的五个构造方法(重写);
- 接着具体的业务层异常继承这个基类ServiceException。

以用户注册为例,具体的业务层异常有:
-
1.用户名被占用异常 UsernameDuplicatedException
-
2.正在执行数据库插入操作的时候,数据库或者服务器宕机(处于正在执行插入操作过程中的异常)InsertException

1)先编写异常类
ServiceException:
package com.cy.store.service.ex;
/** 业务层异常的基类 */
public class ServiceException extends RuntimeException{
// Override Methods...
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);
}
}
UsernameDuplicatedException:
package com.cy.store.service.ex;
/** 用户名被占用异常 */
public class UsernameDuplicatedException extends ServiceException{
// Override Methods...
public UsernameDuplicatedException() {
super();
}
public UsernameDuplicatedException(String message) {
super(message);
}
public UsernameDuplicatedException(String message, Throwable cause) {
super(message, cause);
}
public UsernameDuplicatedException(Throwable cause) {
super(cause);
}
protected UsernameDuplicatedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
InsertException:
package com.cy.store.service.ex;
/** 处于正在执行插入操作过程中的异常 */
public class InsertException extends ServiceException{
public InsertException() {
super();
}
public InsertException(String message) {
super(message);
}
public InsertException(String message, Throwable cause) {
super(message, cause);
}
public InsertException(Throwable cause) {
super(cause);
}
protected InsertException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
2)编写用户注册的业务层接口和继承类
IUserService:
package com.cy.store.service;
import com.cy.store.entity.User;
/** 用户模块业务层接口 */
public interface IUserService {
//用户注册方法
void addUser(User user);
}
UserServiceImpl:
package com.cy.store.service.impl;
import com.cy.store.entity.User;
import com.cy.store.mapper.UserMapper;
import com.cy.store.service.IUserService;
import com.cy.store.service.ex.InsertException;
import com.cy.store.service.ex.UsernameDuplicatedException;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;
/** 用户模块业务层的实现类 */
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private UserMapper userMapper;
@Override
public void addUser(User user) {
User user1 = userMapper.getUserByName(user.getUsername());
if (user1!=null){ //抛出用户名被占用的异常
throw new UsernameDuplicatedException("用户名被占用!");
}
//补全数据 isDelete=0 四个日志字段信息
user.setIsDelete(0);
Date nowDate = new Date();
user.setCreatedUser(user.getUsername());
user.setCreatedTime(nowDate);
user.setModifiedUser(user.getUsername());
user.setModifiedTime(nowDate);
int i = userMapper.addUser(user);
if (i != 1){
throw new InsertException("在用户注册中产生了未知异常!");
}
}
}
3)测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@Autowired
private IUserService userService;
@Test
public void addUserTest() {
try {
User user = new User();
user.setUsername("测试用户11111");
user.setPassword("123456");
user.setGender(1);
userService.addUser(user);
System.out.println("注册成功!");
} catch (ServiceException e) {
//e.getClass():获取异常类的对象 getSimpleName():获取异常类的名称
System.out.println("注册失败!" + e.getClass().getSimpleName());
System.out.println(e.getMessage());//打印输出异常类的具体描述信息
}
}
}
如果出现测试报错 No qualifying bean of type......
可能的原因是:service实现类没有注册到spring中(注意:@Service注解是标注在实现类上的)

二、、密码加密


UserServiceImpl:
/** 用户模块业务层的实现类 */
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private UserMapper userMapper;
@Override
public void addUser(User user) {
User user1 = userMapper.getUserByName(user.getUsername());
if (user1!=null){ //抛出用户名被占用的异常
throw new UsernameDuplicatedException("用户名被占用!");
}
//密码加密处理的实现:MD5算法
//盐值+password+盐值------>MD5算法加密,连续加载加载三次
//盐值就是一个随机的字符串
String oldPassword=user.getPassword();
//获取盐值:随机生成
String salt = UUID.randomUUID().toString().toUpperCase();
user.setSalt(salt);
//将密码和盐值作为一个整体进行加密
String md5Password = getMD5Password(oldPassword, salt);
user.setPassword(md5Password);
//补全数据 isDelete=0 四个日志字段信息
user.setIsDelete(0);
Date nowDate = new Date();
user.setCreatedUser(user.getUsername());
user.setCreatedTime(nowDate);
user.setModifiedUser(user.getUsername());
user.setModifiedTime(nowDate);
int i = userMapper.addUser(user);
if (i != 1){
throw new InsertException("在用户注册中产生了未知异常!");
}
}
//定义一个MD5加密的算法处理
private String getMD5Password(String oldPWD,String salt){
String password=oldPWD;
for (int i=0;i<3;i++){
password = DigestUtils.md5DigestAsHex((salt + password + salt).getBytes()).toUpperCase();
}
return password;
}
}
浙公网安备 33010602011771号