自定义异常---密码的加密处理



一、自定义异常



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;

    }



}





posted @ 2022-04-04 13:56  卡卡发  阅读(144)  评论(0)    收藏  举报