Home >Java >javaTutorial >Detailed explanation of the example of completing the email registration function in java

Detailed explanation of the example of completing the email registration function in java

Y2J
Y2JOriginal
2017-05-12 09:32:452464browse

This article mainly introduces the sample code for implementing the email registration function in Spring Boot. The editor thinks it is quite good, so I will share it with you now and give it as a reference. Let’s follow the editor and take a look.

Registration process

1.[Front-end] Users submit registration information on the registration page;

2. [Backend] Verify the parameters submitted by the user. If there is any error, it will directly return the error message . If there is no error, execute downwards;

3.[Backend End] Randomly generate an ID, use the ID as key, user information as value, store it in redis, and set the duration;

4.[Backend ] Generate an activation link and send an email to the user's mailbox through the email system

5.[Front-end] The user clicks "Confirm Registration" in the picture above;

6.[Back-end end] Verify whether the value has expired, verify whether the mailbox has been registered, if not, save the user information to the database, prompting that the user has successfully registered;

Function implementation (reverse analysis)

1. Let’s first look at the implementation of mail sendingcn.ictgu.tools.mail.MailService

package cn.ictgu.tools.mail;

import cn.ictgu.dao.model.User;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.log4j.Log4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

/**
 * 邮件服务
 * Created by Silence on 2017/3/11.
 */
@Service
@Log4j
public class MailService {

 @Autowired
 private JavaMailSender mailSender;

 @Value("${spring.mail.username}")
 private String from;

 private static final String TITLE_SIGN_UP = "[邮件标题]";

 private static final String CONTENT = "[邮件内容]";

 public void userValidate(User user, String token){
 MimeMessage mailMessage = mailSender.createMimeMessage();
 try {
  MimeMessageHelper helper = new MimeMessageHelper(mailMessage, true, "GBK");
  helper.setFrom(from);
  helper.setTo(user.getEmail());
  helper.setSubject(TITLE_SIGN_UP);
  String link = "http://www.ictgu.cn/validate/" + token;
  String message = String.format(CONTENT, user.getNickname(), link, link, user.getEmail());
  helper.setText(message, true);
  mailSender.send(mailMessage);
 } catch (MessagingException e) {
  log.error("发送邮件失败:User:" + JSONObject.toJSONString(user) + ", Token: " + token);
 }

 }

Description: To send an email, you need to pass in 2 parameters user and token, user is Register information for the user. The token is a random UUID. There is a corresponding key in redis, and its value is the user's json string. (The key rule is Configuration fileredis.prefix.signUp + UUID)

Email template problem:

The essence of the email content It is a string, the style is controlled by html+css. When developing, design the template in the mailbox, replace variable with %s, and then store the entire string in a suitable place. When sending the email, Use the String.format() method to replace %s with the actual value to generate an email for the end user to see. Therefore, there is no need to use third-party templates. Adding jar packages will increase the complexity of the system. The same functions can be simplified as much as possible.

2. How to generate Token? Please see cn.ictgu.redis.RedisTokenManager

 public String getTokenOfSignUp(User user){
 String token = UUID.randomUUID().toString();
 String value = JSONObject.toJSONString(user);
 stringRedisTemplate.opsForValue().set(signUpPrefix + token, value);
 stringRedisTemplate.expire(signUpPrefix + token, 12, TimeUnit.HOURS);
 return token;
 }

Description: UUID.randomUUID().toString() is a method provided by javaJDK to automatically generate primary keys. UUID (Universally Unique Identifier) globally unique identifier refers to a number generated on one machine, which is guaranteed to be valid for all machines in the same time and space. The only thing is that it consists of a sixteen-digit number and is expressed in a form. It is a combination of the following parts: the current date and time (the first part of the UUID is related to the time, if you generate a UUID after a few seconds, the first part is different and the rest are the same), clock Sequence, a globally unique IEEE machine identification number (if there is a network card, it is obtained from the network card, if there is no network card, it is obtained in other ways). The only flaw of UUID is that the generated result string will be relatively long.

3. Once you have the token, you need to associate the user and token in the service layer to send emails. See cn.ictgu.dao.service.UserService

 public boolean signUp(User user){
 String email = user.getEmail();
 if (existEmail(email)){
  log.error("用户注册,邮箱已注册:" + email);
  return false;
 }
 sendValidateEmail(user);
 return true;
 }

 @Async
 private void sendValidateEmail(User user){
 String token = tokenManager.getTokenOfSignUp(user);
 log.error("用户注册,准备发送邮件:User:" + JSONObject.toJSONString(user) + ", Token: " + token);
 mailService.userValidate(user, token);
 }

 private boolean existEmail(String email){
 return mapper.selectByEmail(email) != null;
 }

Note: Sending emails takes a long time. Long, use asynchronous to do it, improve user experience

4. User is simple

@RestController
public class UserApi {

 @Autowired
 private UserService userService;

 @RequestMapping(value = "/sign-up", method = RequestMethod.POST)
 public SimpleResponse signUp(HttpServletRequest request){
 User user = createUser(request);
 SimpleResponse response = checkSignUpRequest(user);
 if (response.getCode() == 100){
  if (!userService.signUp(user)){
  response.setCode(200);
  response.setMessage("此邮箱已注册,请勿重复注册!");
  return response;
  }else {
  response.setMessage("注册激活邮件已发送至您邮箱,请在12小时内激活完成注册!");
  return response;
  }
 }
 return response;
 }

 private SimpleResponse checkSignUpRequest(User user){
 SimpleResponse response = new SimpleResponse();
 String email = user.getEmail();
 if (!CheckUtils.checkEmail(email)){
  response.setCode(200);
  response.setMessage("邮箱格式不合法");
  return response;
 }
 String password = user.getPassword();
 if (!CheckUtils.checkPassword(password)){
  response.setCode(200);
  response.setMessage("密码长度必须为8-16位,且必须包含数字和字母");
  return response;
 }
 String nickname = user.getNickname();
 if (!CheckUtils.checkNickname(nickname)){
  response.setCode(200);
  response.setMessage("昵称长度不合法");
  return response;
 }
 response.setCode(100);
 return response;
 }

}

Description: This layer mainly does the verification of user registration parameters

Rendering

##Review

Looking from bottom to top, everything from user registration to email sending is realized , most of the code is used for parameter verification, because user

behavior is not trustworthy. To build a safe background system, it is necessary to verify without blind spots. . . .

【Related Recommendations】

1.

Java Free Video Tutorial

2.

YMP Online Manual

3.

JAVA Beginner’s Video Tutorial

The above is the detailed content of Detailed explanation of the example of completing the email registration function in java. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn