Commit f1e39703 by wzy

GlobalExceptionHandler

parent 3bc0bbba
......@@ -60,6 +60,11 @@
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
<build>
......
package cn.drive.controller;
import cn.drive.entity.User;
import cn.drive.enums.OperationEnum;
import cn.drive.service.UserService;
import cn.drive.vo.ResponseVO;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
import javax.validation.Valid;
......@@ -13,6 +18,11 @@ import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import java.util.Objects;
import java.util.Random;
import java.util.concurrent.TimeUnit;
@Validated
@RequestMapping("/user")
@RestController
......@@ -20,9 +30,35 @@ public class UserController {
@Resource
UserService userService;
@Resource
RedisTemplate<String, Map<OperationEnum, Integer>> redisTemplate;
@GetMapping()
public ResponseEntity<?> sendVerificationCode(@Valid @Email @NotBlank String email) {
userService.sendVerificationCode(email);
public ResponseEntity<?> sendVerificationCode(@Valid @Email @NotBlank String email, OperationEnum operation) {
int verificationCode = new Random().nextInt(899999) + 100000;
userService.sendVerificationCode(email, verificationCode);
BoundHashOperations<String, Object, Object> verificationCodeOperation = redisTemplate.boundHashOps(email);
verificationCodeOperation.put(operation, verificationCode);
verificationCodeOperation.expire(5, TimeUnit.MINUTES);
return new ResponseEntity<>(ResponseVO.success("已将验证码发送到 "+email), HttpStatus.OK);
}
@PostMapping()
public ResponseEntity<?> signUp(@Valid SignUpParam signUpParam) throws Exception {
if(!Objects.equals(redisTemplate.boundHashOps(signUpParam.user.getEmail()).get(OperationEnum.SIGN_UP), signUpParam.verificationCode)){
throw new Exception("验证码错误或已失效");
}
return new ResponseEntity<>(ResponseVO.success("注册成功"), HttpStatus.OK);
}
}
class SignUpParam {
User user;
@NotBlank
String verificationCode;
}
\ No newline at end of file
......@@ -3,9 +3,16 @@ package cn.drive.entity;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
@Data
public class User {
@NotBlank
private String id;
@Email(message = "邮箱格式不正确")
private String email;
@NotBlank
private String password;
}
package cn.drive.enums;
public enum OperationEnum {
SIGN_UP("注册");
private final String operation;
OperationEnum(String operation) {
this.operation = operation;
}
public String getOperation() {
return operation;
}
}
......@@ -11,7 +11,6 @@ import static org.springframework.http.HttpStatus.UNPROCESSABLE_ENTITY;
public class ConstraintViolationHandler {
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<?> handleMethodArgumentNotValid(ConstraintViolationException e) {
System.out.println();
return new ResponseEntity<>(ResponseVO.failure(e.getLocalizedMessage()), UNPROCESSABLE_ENTITY);
}
}
......@@ -8,17 +8,15 @@ import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import static org.springframework.http.HttpStatus.UNPROCESSABLE_ENTITY;
import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({InvalidRequestException.class})
public ResponseEntity<Object> handleInvalidRequest(RuntimeException e, WebRequest request) {
InvalidRequestException ire = (InvalidRequestException) e;
@ExceptionHandler({Exception.class})
public ResponseEntity<Object> handleException(RuntimeException e, WebRequest request) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return handleExceptionInternal(e, ResponseVO.failure(ire.getSysException()), headers, UNPROCESSABLE_ENTITY, request);
return handleExceptionInternal(e, ResponseVO.failure(e.getLocalizedMessage()), headers, INTERNAL_SERVER_ERROR, request);
}
}
package cn.drive.exception;
import cn.drive.vo.ResponseVO;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import static org.springframework.http.HttpStatus.UNPROCESSABLE_ENTITY;
@RestControllerAdvice
public class InvalidRequestExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({InvalidRequestException.class})
public ResponseEntity<Object> handleInvalidRequest(RuntimeException e, WebRequest request) {
InvalidRequestException ire = (InvalidRequestException) e;
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return handleExceptionInternal(e, ResponseVO.failure(ire.getSysException()), headers, UNPROCESSABLE_ENTITY, request);
}
}
......@@ -6,6 +6,7 @@ import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Slf4j
......@@ -17,19 +18,14 @@ public class EmailService {
@Resource
private JavaMailSender javaMailSender;
public void sendVerificationCode(String receiver, String subject, String content) {
public void sendVerificationCode(String receiver, String subject, String content) throws MailException {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setTo(receiver);
simpleMailMessage.setFrom(sender);
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
try {
javaMailSender.send(simpleMailMessage);
} catch (MailException mailException) {
throw
}
javaMailSender.send(simpleMailMessage);
log.info("邮件发送成功: from[{}], to[{}], subject[{}], content[{}]", sender, receiver, subject, content);
}
}
......@@ -4,5 +4,5 @@ import cn.drive.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
public interface UserService extends IService<User> {
void sendVerificationCode(String email);
void sendVerificationCode(String email, int verificationCode);
}
......@@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Random;
......@@ -27,13 +26,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
EmailService emailService;
@Override
public void sendVerificationCode(String email) {
public void sendVerificationCode(String email, int verificationCode) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("email", email);
if (userService.getOne(queryWrapper) != null) {
throw new InvalidRequestException(new SysException(SysErrorEnum.EMAIL_ALREADY_TAKEN));
}
int verificationCode = new Random().nextInt(899999) + 100000;
emailService.sendVerificationCode(email, signUpSubject, String.valueOf(verificationCode));
}
}
......@@ -5,10 +5,14 @@ spring:
username: root
password: 123
mail:
username: im_fine_thanku@163.com
username: core_2021@163.com
sign-up-subject: 注册
host: smtp.163.com
password: wzy12345
password: OWCVISPNQZIJTISX
default-encoding: utf-8
redis:
host: localhost
port: 6379
database: 0
mybatis-plus:
mapper-locations: classpath*:/mapper/**Mapper.xml
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment