普通人写的登录
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;
}
}
在写业务代码的时候,通过异常来阻断程序,代码是不是简洁很多,看起来逻辑也清晰很多。