第一章
1.Spring Boot环境搭建
添加依赖
2.集成Thymeleaf , Result结果封装
添加依赖、配置信息
3.集成Mybatis + Druid
添加依赖、配置信息
4.集成Redis+通用缓存Key封装
添加依赖+redis配置信息+JedisPool /RedisTemplate +RedisService(包含序列化)
第二章
1.数据库设计
并且编写对应的pojo类和mapper接口
2.明文密码两次MD5处理
MD5(MD5(密码,固定salt),数据库中的salt)
抽象成一个util类
3. JSR303参数检验+全局异常处理器
在LoginVo添加注解来取代LoginController中对传入参数LoginVo的参数校验。如下所示
@NotNull
@IsMobile
private String mobile;
@NotNull
@Length(min = 32)
private String password;
自定义注解@IsMobile
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {IsMobileValidator.class})
public @interface IsMobile {
boolean required() default true;
String message() default "手机号码格式有误";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
import com.lcy.miaosha.util.ValidatorUtil;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {
private boolean required=false;
@Override
public void initialize(IsMobile constraintAnnotation) {
required=constraintAnnotation.required();
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if (required){
return ValidatorUtil.isMobile(s);
}else {
if (StringUtils.isEmpty(s))
return true;
else
return ValidatorUtil.isMobile(s);
}
}
}
参数异常将产生BindException异常
定义一个全局异常处理器
import java.util.List;
/**
* 全局异常处理器
*/
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public Result<String> exceptionHandler(HttpServletRequest request,Exception e){
e.printStackTrace();
if (e instanceof GlobalException){
GlobalException ex=(GlobalException)e;
return Result.error(ex.getCm());
}else if (e instanceof BindException){
BindException ex=(BindException)e;
List<ObjectError> errors = ex.getAllErrors();
ObjectError error=errors.get(0);
String msg =error.getDefaultMessage();
return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));
}else {
return Result.error(CodeMsg.SERVER_ERROR);
}
}
}
4.分布式Session
1.在登录完成后生成token写进cookie并存到Session中,并且存到redis中<token,user>的形式
2.当在其他页面时,token随之传递,编写getByToken来得到我们存到Redis的user并且从新定义一个cookie,来更新cookie时效
3.重写WebMvcConfigurerAdapter中的addArgumentResolvers是的controller可以识别user信息