秒殺系統Web實踐——設計流程

第一章

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信息




 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章