首页 > 解决方案 > 当用户点击从春季发送给他的链接时,如何创建电子邮件验证页面?

问题描述

我有一个弹簧控制器,在他创建一个新帐户后向用户发送一封电子邮件,其中包含一个看起来像这样的链接“要确认您的帐户,请单击此处:http://localhost:8082/confirm-account?token= THE_TOKEN ”,但我在创建一个使用 Angular 的网页时遇到了麻烦,当用户点击链接时会显示该网页。你能帮助我吗?

这是春天的控制器:

package com.example.demo.controller;

import com.example.demo.domain.ConfirmationToken;
import com.example.demo.domain.Response;
import com.example.demo.domain.User;
import com.example.demo.repository.ConfirmationTokenRepository;
import com.example.demo.repository.UserRepository;
import com.example.demo.service.EmailSenderService;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.web.bind.annotation.*;

import java.util.Calendar;


@RestController
@CrossOrigin
public class UserAccountController {

@Autowired
private UserRepository userRepository;
@Autowired
private UserService userService;

@Autowired
private ConfirmationTokenRepository confirmationTokenRepository;

@Autowired
private EmailSenderService emailSenderService;



@RequestMapping(value="/register", method= RequestMethod.POST)
@ResponseBody
public ResponseEntity<Response> registerUser( @RequestBody User user)
{
        userService.saveUser(user);
        ConfirmationToken confirmationToken = new ConfirmationToken(user);

        confirmationTokenRepository.save(confirmationToken);

        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setTo(user.getEmail());
        mailMessage.setSubject("Complete Registration!");
        mailMessage.setFrom("ddailyservice@gmail.com");
        mailMessage.setText("To confirm your account, please click here : "
        +"http://localhost:8082/confirm-account?token="+confirmationToken.getConfirmationToken());

        emailSenderService.sendEmail(mailMessage);

    return new ResponseEntity<Response>(new Response("User is saved successfully"), HttpStatus.OK) ;
}



@RequestMapping(value="/confirm-account", method= { RequestMethod.GET})
@ResponseBody
public ResponseEntity<Response> confirmUserAccount(@RequestParam("token") String confirmationToken)
{
    ConfirmationToken token = confirmationTokenRepository.findByConfirmationToken(confirmationToken);
    User user = token.getUser();
    Calendar calendar = Calendar.getInstance();
    if((token.getExpiryDate().getTime() - calendar.getTime().getTime()) <=0) {
        return new ResponseEntity<Response>(new Response("token is expired"), HttpStatus.OK);
    }

    if(token != null)
    {
        user=userRepository.findByUsernameIgnoreCase(token.getUser().getUsername());
        user.setEnabled(true);
        userRepository.save(user);
    }
    else
    {

        return new ResponseEntity<Response>(new Response("token is broken"), HttpStatus.OK);
    }

    return new ResponseEntity<Response>(new Response("account verified"), HttpStatus.OK);
}

public UserRepository getUserRepository() {
    return userRepository;
}

public void setUserRepository(UserRepository userRepository) {
    this.userRepository = userRepository;
}

public ConfirmationTokenRepository getConfirmationTokenRepository() {
    return confirmationTokenRepository;
}

public void setConfirmationTokenRepository(ConfirmationTokenRepository confirmationTokenRepository) {
    this.confirmationTokenRepository = confirmationTokenRepository;
}

public EmailSenderService getEmailSenderService() {
    return emailSenderService;
}

public void setEmailSenderService(EmailSenderService emailSenderService) {
    this.emailSenderService = emailSenderService;
}

}

和确认令牌实体:

package com.example.demo.domain;


import javax.persistence.*;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;

@Entity
public class ConfirmationToken {
private final static int EXPIRATION = 60*24;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="token_id")
private long tokenid;

@Column(name="confirmation_token")
private String confirmationToken;

@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;

@OneToOne(targetEntity = User.class, fetch = FetchType.EAGER, cascade =  {CascadeType.REMOVE}, orphanRemoval = true)
@JoinColumn(nullable = false, name = "user_id")
private User user;

private Date expiryDate;

public Date getExpiryDate() {
    return expiryDate;
}

public void setExpiryDate(Date expiryDate) {
    this.expiryDate = expiryDate;
}

private Date calculateExpiryDate(int expiryTimeInMinutes) {

    Calendar calendar = Calendar.getInstance();

    calendar.setTime(new Timestamp(calendar.getTime().getTime()));

    calendar.add(Calendar.MINUTE, expiryTimeInMinutes);

    return new Date(calendar.getTime().getTime());

}

public ConfirmationToken() {
}

public ConfirmationToken(User user) {
    this.user = user;
    confirmationToken = UUID.randomUUID().toString();
    Calendar calendar = Calendar.getInstance();
    createdDate = new Date(calendar.getTime().getTime());
    this.expiryDate = calculateExpiryDate(EXPIRATION);
}

public ConfirmationToken(final String confirmationToken) {
    this.confirmationToken = confirmationToken;
    this.expiryDate = calculateExpiryDate(EXPIRATION);
}

public String getConfirmationToken() {
    return confirmationToken;
}

public void setConfirmationToken(String confirmationToken) {
    this.confirmationToken = confirmationToken;
}

public Date getCreatedDate() {
    return createdDate;
}

public void setCreatedDate(Date createdDate) {
    this.createdDate = createdDate;
}

public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

public long getTokenid() {
    return tokenid;
}

public void setTokenid(long tokenid) {
    this.tokenid = tokenid;
}
}

标签: htmlangularspring

解决方案


推荐阅读