1,登录
2,注册
3,重名校验
4,密码加密
5,session保存登录信息
6,越权校验(只分为用户和管理员两个)
一:
创建common包内创建ApiRestResponce类创建统一Api返回对象
public class ApiRestResponse<T> {//定义泛型,类后面加上<T>,<X>X啥字母都行 private Integer status; private String msg; private T data;//泛型 //定义正常运行时的状态码 private static final int OK_CODE = 10000; private static final String OK_MSG = "SUCCESS"; //构造函数************************************** public ApiRestResponse(Integer status, String msg, T data) { this.status = status; this.msg = msg; this.data = data; } public ApiRestResponse(Integer status, String msg) { this.status = status; this.msg = msg; } //默认信息 public ApiRestResponse() { this(OK_CODE,OK_MSG); } //************************************************************** //返回通用的响应对象,成功 public static <T> ApiRestResponse<T> success(){ return new ApiRestResponse<>(); } public static <T> ApiRestResponse<T> success(T result){ ApiRestResponse<T> response = new ApiRestResponse<>(); response.setData(result); return response; } //失败 public static <T> ApiRestResponse<T> error(Integer code,String msg){ return new ApiRestResponse<>(code,msg); }//创建一个类,将常见的错误收拢在一起,找到枚举值调用,不用自己去写 public static <T> ApiRestResponse<T> error(DemoExceptionEnum exceptionEnum){ return new ApiRestResponse<>(exceptionEnum.getCode(),exceptionEnum.getMsg()); } @Override public String toString() { return "ApiRestResponse{" + "status=" + status + ", msg='" + msg + '\'' +1111+ ", data=" + data + '}'; } //******************************************************************************************************************** public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
由于返回错误信息时有多种异常,每次进行编写又复杂故考虑使用枚举的方法创建异常枚举类
二:
注册功能实现:
创建异常包exception内部添加枚举类(项目名+ExceptionEnum)
/** * * 描述: 异常枚举 */ public enum (xxxx)Enum { //写枚举时前一个与后一个用","分隔,不能用“;” //业务异常 NEED_USER_NAME(10001,"用户名不能为空"), NEED_PASSWORD(10002,"密码不能为空"), PASSWORD_TOO_SORT(10003,"密码长度不能少于八位"), NOT_USE_THE_SAME_NAME(10004,"不允许重名注册失败"), INSERT_FAILED(10005,"插入失败请重试"), WRONG_PASSWORD(10007,"密码错误"), NAME_NOT_NULL(10006,"名字不能为空"), NEED_LOGIN(10008,"需要登录"), UPDATE_FAILED(10009, "更新失败"), NEED_ADMIN(10010, "无管理员权限"), CREATE_FAILED (10011,"创建失败"), REQUEST_PARAM_ERROR(10012, "参数错误"), //系统异常 SYSTEM_ERROR(20000,"系统异常"); /** * 异常码 */ Integer code; /** * 异常信息 */ String msg; DemoExceptionEnum(Integer code, String msg) { this.code = code; this.msg = msg; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
Service中不能直接调用枚举类,故创建统一异常类(项目名+Exception)
/** * 统一异常 */ public class DemoException extends RuntimeException { private final Integer code; private final String message; public DemoException(Integer code, String message) { this.code = code; this.message = message; } public DemoException(DemoExceptionEnum exceptionEnum) { this(exceptionEnum.getCode(), exceptionEnum.getMsg()); } public Integer getCode() { return code; } @Override public String getMessage() { return message; } }
三:controller层
@PostMapping("/register") @ResponseBody public ApiRestResponse register(@RequestParam("userName") String userName, @RequestParam("password") String password){ //由于参数在请求中加入注解便于识别,加入注解还需指定参数名 // if (username == null)如果对象不是null,字符串内什么都没有会导致误判 if (StringUtils.isEmpty(userName)){ return ApiRestResponse.error(SpringLearnExceptionEnum.NEED_USER_NAME); } if (StringUtils.isEmpty(password)){ return ApiRestResponse.error(SpringLearnExceptionEnum.NEED_PASSWORD); } //密码长度不能少于8位 if (password.length() < 8){ return ApiRestResponse.error(SpringLearnExceptionEnum.PASSWORD_TOO_SORT); } userService.register(userName,password); return ApiRestResponse.success(); }
判断用户名密码为空,密码长度,不符合调用枚举类
mapper:新加入一个需要去xml中进行实现
User selectByName(String userName);
<select id="selectByName" parameterType="java.lang.String" resultMap="BaseResultMap"> select -- <include refid="Base_Column_List"></include>表示将要选取的是一个完整的user对象 from imooc_mall_user where username = #{userName,jdbcType=VARCHAR} </select>
service:
void register(String userName,String password);
@Override public void register(String userName, String password) { //查询是否存在用户,不允许重名 User result = userMapper.selectByName(userName); if (result != null){ throw new SpringLearnException(SpringLearnExceptionEnum.NOT_USE_THE_SAME_NAME); } //写到数据库 /** * 1,创建一个新的User * 2,把username传进去 * 3,password传进去,加盐之后 * 4,用userMapper 把user对象传进去 */ User user = new User(); user.setUsername(userName); try { user.setPassword(MD5Utils.getMD5Str(password)); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } int count = userMapper.insertSelective(user); if(count == 0){ throw new SpringLearnException(SpringLearnExceptionEnum.INSERT_FAILED); } }
密码加密用的MD5创建utils包建MD5Utils类
/** * 描述 :MD5工具 */ public class MD5Utils { //工具类一般使用static修饰,方便其他类进行调用 public static String getMD5Str(String strValue) throws NoSuchAlgorithmException { MessageDigest md5 = MessageDigest.getInstance("MD5"); return Base64.encodeBase64String(md5.digest((strValue + Constant.SALT).getBytes())); } public static void main(String[] args) { String md5 = null; try { md5 = getMD5Str("12345678"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } System.out.println(md5); } }
盐值添加方式很多。。。
打开postman进行测试