利用Redis实现分布式Session
利用Redis实现分布式Session 1. 创建生成UUID的类 UUIDUtil import java.util.UUID; public class…
自定义参数校验器和全局异常处理器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
在Controller的方法参数前面添加 @Valid
@RequestMapping("/do_login")
@ResponseBody
public Result<Boolean> doLogin(HttpServletResponse response, @Valid LoginVo loginVo) {
log.info("{}", loginVo);
miaoshaUserService.login(response, loginVo);
return Result.success(true);
}
LoginVo
import com.liuyao.miaosha.validator.IsMobile;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotNull;
@Setter
@Getter
@ToString
public class LoginVo {
@NotNull
@IsMobile
private String mobile;
@NotNull
@Length(min = 32)
private String password;
}
在相应的属性上面添加验证注解,更多注解查看:JSR 303 - Bean Validation 简介及使用方法
我们上面用了 @IsMobile
,下面来生成相应注解
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})
@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 {};
}
IsMobileValidator
import com.liuyao.miaosha.util.ValidatorUtil;
import org.springframework.util.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);
}
}
}
}
GlobalException
import com.liuyao.miaosha.result.CodeMsg;
import lombok.Getter;
@Getter
public class GlobalException extends RuntimeException {
private CodeMsg codeMsg;
public GlobalException(CodeMsg codeMsg) {
this.codeMsg = codeMsg;
}
}
GlobalExceptionHandler
import com.liuyao.miaosha.result.CodeMsg;
import com.liuyao.miaosha.result.Result;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
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.getCodeMsg());
} 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);
}
}
}
这样在验证出错的时候我们就可以直接抛出异常
public boolean login(HttpServletResponse response, LoginVo loginVo) {
if (loginVo == null) {
throw new GlobalException(CodeMsg.SERVER_ERROR);
}
String mobile = loginVo.getMobile();
String fromPass = loginVo.getPassword();
// 判断手机号是否存在
MiaoshaUser user = getById(Long.parseLong(mobile));
if (user == null) {
throw new GlobalException(CodeMsg.MOBILE_NO_EXIST);
}
//验证密码
String dbPasss = user.getPassword();
String saltDB = user.getSalt();
String calcPass = MD5Util.fromPassToDBPass(fromPass, saltDB);
if (!calcPass.equals(dbPasss)) {
throw new GlobalException(CodeMsg.PASSWORD_ERROR);
}
....
}
利用Redis实现分布式Session 1. 创建生成UUID的类 UUIDUtil import java.util.UUID; public class…
封装返回JSON数据 一般Controller在返回的时候有两种情况,一种是 rest api json输入,一种是页面。 一般与前端做JSON格式约定: { "code&…