博客 分类专栏 专题 成员
如何优雅的写登录
2022-10-21 02:33:03
分类专栏: Java

普通人写的登录

UserInfo

public class UserInfo {
    private Integer userId;
    private String account;
    private String password;
    private Integer status;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }
}

Controller

import com.springboot.demo.entity.po.UserInfo;
import com.springboot.demo.entity.vo.ResultVO;
import com.springboot.demo.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.Map;

@RestController
public class BadLoginController {

    @Resource
    private UserService loginService;

    @RequestMapping("badLogin")
    public ResultVO badLogin(HttpSession session, String account, String password) {
        ResultVO resultVO = new ResultVO();
        Map<String, Object> result = loginService.loginBad(account, password);
        Boolean success = (Boolean) result.get("success");
        if (success) {
            resultVO.setCode(200);
            resultVO.setInfo("登录成功");
            resultVO.setStatus("success");
            resultVO.setData(((UserInfo) result.get("userInfo")).getUserId());
            session.setAttribute("session_info", result.get("userInfo"));
        } else {
            resultVO.setCode(500);
            resultVO.setInfo((String) result.get("info"));
            resultVO.setStatus("error");
            resultVO.setData(null);
        }
        return resultVO;
    }
}

Service

@Service("logService")
public class UserService {

    @Resource
    private UserMapper userMapper;

    public Map<String, Object> loginBad(String account, String password) {
        Map<String, Object> result = new HashMap<>();
        UserInfo userInfo = userMapper.selectByAccount(account);
        if (userInfo != null) {
            if (userInfo.getPassword().equals(password)) {
                if (userInfo.getStatus() == 1) {
                    result.put("success", true);
                    result.put("userInfo", userInfo);
                } else {
                    result.put("success", false);
                    result.put("info", "账号已禁用");
                }
            } else {
                result.put("success", false);
                result.put("info", "账号或者密码不正确");
            }
        } else {
            result.put("success", false);
            result.put("info", "账号或者密码不正确");
        }
        return result;
    }
}

模拟mapper

这里写个模拟的mapper查询数据库

@Component
public class UserMapper {
    public UserInfo selectByAccount(String account) {
        if (account.equals("admin")) {
            UserInfo userInfo = new UserInfo();
            userInfo.setUserId(10000);
            userInfo.setAccount("admin");
            userInfo.setPassword("123");
            userInfo.setStatus(1);
            return userInfo;
        } else if (account.equals("root")) {
            UserInfo userInfo = new UserInfo();
            userInfo.setUserId(10001);
            userInfo.setAccount("root");
            userInfo.setPassword("123");
            userInfo.setStatus(0);
            return userInfo;
        } else {
            return null;
        }
    }
}

看下你们项目的代码是不是很多都是一层套一层的if else
有人就说了,代码能跑就行那那么多讲究 ^_^

高手写的登录

先增加几个基础的类

ResultCodeEnum

public enum ResultCodeEnum {
    CODE_200(200, "操作成功"),
    CODE_404(404, "请求地址不存在"),
    CODE_300(300, "请求参数错误"),
    CODE_1001(1001, "账号或者密码错误"),
    CODE_1002(1002, "账号已禁用");

    private Integer code;
    private String desc;

    ResultCodeEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public Integer getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }
}

ResultStatusEnum

public enum ResultStatusEnum {
    SUCCESS("success", "请求成功"),
    FAIL("fail", "请求失败");

    private String status;
    private String desc;

    ResultStatusEnum(String code, String desc) {
        this.status = code;
        this.desc = desc;
    }

    public String getStatus() {
        return status;
    }

    public String getDesc() {
        return desc;
    }
}

UserInfo

public class UserInfo {
    private Integer userId;
    private String account;
    private String password;
    private Integer status;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }
}

ResultVO

public class ResultVO<T> {
    private Integer code;
    private String status;
    private String info;
    private T data;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

BusinessException

public class BusinessException extends RuntimeException {
    private static final long serialVersionUID = 2874310081615076500L;

    private Integer code;

    public BusinessException(String message, Throwable e) {
        super(message, e);
    }

    public BusinessException(String message) {
        super(message);
    }

    public BusinessException(String message, Integer code) {
        super(message);
        this.code = code;
    }

    public BusinessException(ResultCodeEnum resultCode) {
        super(resultCode.getDesc());
        this.code = resultCode.getCode();
    }

    public BusinessException(Throwable e) {
        super(e);
    }

    @Override
    public Throwable fillInStackTrace() {
        return this;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }
}

增加一个全局异常拦截

AGlobalExeptionController

@RestControllerAdvice
public class AGlobalExeptionController {
    private static final Logger logger = LoggerFactory.getLogger(AGlobalExeptionController.class);

    @ExceptionHandler(value = Exception.class)
    Object handleException(Exception e, HttpServletRequest request) {
        ResultVO resultVO = new ResultVO();
        resultVO.setStatus(ResultStatusEnum.FAIL.getStatus());
        if (e instanceof NoHandlerFoundException) {
            logger.error("请求错误,请求地址{}, 不存在", request.getRequestURL());
            resultVO.setCode(ResultCodeEnum.CODE_404.getCode());
            resultVO.setInfo(ResultCodeEnum.CODE_404.getDesc());
        } else if (e instanceof BusinessException) {
            logger.error("业务异常", e);
            BusinessException biz = (BusinessException) e;
            resultVO.setCode(biz.getCode());
            resultVO.setInfo(biz.getMessage());
        } else {
            logger.error("请求参数错误,请求地址{}, msg {}", request.getRequestURL(), e);
            resultVO.setCode(ResultCodeEnum.CODE_300.getCode());
            resultVO.setInfo(ResultCodeEnum.CODE_300.getDesc());
        }
        return resultVO;
    }
}

增加一个基础的controller,所有controller都继承这个类

ABasecontroller

public class ABaseController {

    private static final String SESSION_kEY = "session_key";

    protected <T> ResultVO getSuccessResultVO(T t) {
        ResultVO<T> resultVO = new ResultVO<>();
        resultVO.setCode(ResultCodeEnum.CODE_200.getCode());
        resultVO.setInfo(ResultCodeEnum.CODE_200.getDesc());
        resultVO.setStatus(ResultStatusEnum.SUCCESS.getStatus());
        resultVO.setData(t);
        return resultVO;
    }

    protected void setSessionInfo(HttpSession session, UserInfo userInfo) {
        session.setAttribute(SESSION_kEY, userInfo);
    }

    protected UserInfo getSessionInfo(HttpSession session) {
        return (UserInfo) session.getAttribute(SESSION_kEY);
    }
}

Controller

@RestController
public class ExcellentController extends ABaseController {
    @Resource
    private UserService loginService;

    @RequestMapping("excellentLogin")
    public ResultVO excellentLogin(HttpSession session, String account, String password) {
        UserInfo userInfo = loginService.loginExcellent(account, password);
        setSessionInfo(session, userInfo);
        return getSuccessResultVO(userInfo.getUserId());
    }
}

UserService

@Service("logService")
public class UserService {

    @Resource
    private UserMapper userMapper;

    public UserInfo loginExcellent(String account, String password) {
        UserInfo userInfo = userMapper.selectByAccount(account);
        if (userInfo == null || !userInfo.getPassword().equals(password)) {
            throw new BusinessException(ResultCodeEnum.CODE_1001);
        }

        if (userInfo.getStatus() != 1) {
            throw new BusinessException(ResultCodeEnum.CODE_1002);
        }
        return userInfo;
    }
}

在写业务代码的时候,通过异常来阻断程序,代码是不是简洁很多,看起来逻辑也清晰很多。