注册一个新用户,但如果用户名或电子邮件已经存在,则返回http错误



我正在努力学习spring,但很难理解如何使用它。

我目前有一个react前端,一个注册页面,它接受用户名、密码和电子邮件,在提交时,它会在路由/注册(使用fetch(上创建一个帖子请求。

在后端,我有一个用户模型类和一个控制器,该控制器在此路由上有一个方法,该方法接受用户并将其保存在PostGreSQL数据库中。

@Controller
@RequestMapping("/")
public class SignUpController {

@Autowired
UserRepo repo;
@RequestMapping(value = "/signup", method = RequestMethod.POST)
@ResponseBody
public void signUp(@Valid @RequestBody User user) {
repo.save(user);
System.out.println("NEW USER SUBMISSION!!!");
}
}

所以,现在我想要两样东西:

  1. 用户名是表的id。但是,如果用户名或电子邮件已经在表中,我想阻止提交。不仅如此,我还想用特定的消息返回一个http错误respose(我猜是403(,这样我就可以更新前端向用户提供反馈。因此,如果用户名或/和电子邮件已经存在,这将是一条不同的消息。

  2. 之后,我想根据我的需要筛选提交的内容。例如,我想限制用户名或密码的长度,或者根据正则表达式对其进行筛选。同样,我该如何做到这一点,并创建一个http错误响应,其中包含一条描述所发生违规的特定消息?

如果你要从互联网上发布任何代码,请务必解释。

您可以在存储库中添加一个查询,该查询将尝试为每个参数获取一个User。

Optional<User> findByUsername(String username);
Optional<User> findByEmail(String email);

然后,您可以在数据库中已经存在用户名或电子邮件的情况下对逻辑进行编程。

@Controller
@RequestMapping("/")
public class SignUpController {
@Autowired
UserRepo repo;
@RequestMapping(value = "/signup", method = RequestMethod.POST)
@ResponseBody
public void signUp(@Valid @RequestBody User user) throws Exception {
Optional<User> usernameEntry = repo.findByUsername(user.getUsername());
Optional<User> emailEntry = repo.findByEmail(user.getEmail());
if(usernameEntry.isPresent()){
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Username already exists!");
} 
if(emailEntry.isPresent()){
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Email already exists!");
}
if(validateInputs(user)){ // filter as you need in this method
repo.save(user);
System.out.println("New user submission!");
}
}
private boolean validateInputs(User user) throws Exception{
// validations and exceptions as you need here
}

异常的逻辑和过滤器的工作原理相同,在方法中抛出所需的异常。话虽如此,我认为如果你直接在前端设置输入的长度会更容易。此外,我认为你不应该限制用户希望密码的强度,如果你担心存储中的长度,像BCrypt这样的加密算法会设置长度。要进一步了解我在这个例子中使用的ResponseStatusException,您可以阅读这篇Baeldung文章。

相关内容

最新更新