zoukankan      html  css  js  c++  java
  • java 实现邮箱激活码验证

    数据库需要增加两个字段,1.是否激活. 2.激活码。
    1.在注册完成的同时,生成一个随机数(例如UUID),保存该随机数到激活码字段,同时设置为未激活。
    2.把激活地址URL发送邮件给用户填写的邮箱,URL构成为,处理地址+参数=激活码。
    3.用户点击该URL,处理该激活码是否和数据库中的相同,相同则设置该用户激活,同时删除激活码字段。  否则返回错误页面
    至于发邮件可以用jemail等第三方J包。
    RegisterValidateService.java代码如下:
    package com.app.service.impl;
    
    import java.text.ParseException;
    import java.util.Date;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import com.app.dao.UserDao;
    import com.app.tools.MD5Tool;
    import com.app.tools.MD5Util;
    import com.app.tools.SendEmail;
    import com.app.tools.ServiceException;
    import com.code.model.UserModel;
    
    /**
     * 
     * @author Qixuan.Chen
     */
    @Service
    public class RegisterValidateService {
    
        @Autowired
        private UserDao userDao;
    
        /**
         * 处理注册
         */
    
        public void processregister(String email){
            UserModel user=new UserModel();
            Long as=5480l;
            user.setId(as);
            user.setName("xiaoming");
            user.setPassword("324545");
            user.setEmail(email);
            user.setRegisterTime(new Date());
            user.setStatus(0);
            ///如果处于安全,可以将激活码处理的更复杂点,这里我稍做简单处理
            //user.setValidateCode(MD5Tool.MD5Encrypt(email));
            user.setValidateCode(MD5Util.encode2hex(email));
    
            userDao.save(user);//保存注册信息
    
            ///邮件的内容
            StringBuffer sb=new StringBuffer("点击下面链接激活账号,48小时生效,否则重新注册账号,链接只能使用一次,请尽快激活!</br>");
            sb.append("<a href="http://localhost:8080/springmvc/user/register?action=activate&email=");
            sb.append(email); 
            sb.append("&validateCode="); 
            sb.append(user.getValidateCode());
            sb.append("">http://localhost:8080/springmvc/user/register?action=activate&email="); 
            sb.append(email);
            sb.append("&validateCode=");
            sb.append(user.getValidateCode());
            sb.append("</a>");
    
            //发送邮件
            SendEmail.send(email, sb.toString());
            System.out.println("发送邮件");
    
        }
    
        /**
         * 处理激活
         * @throws ParseException 
         */
          ///传递激活码和email过来
        public void processActivate(String email , String validateCode)throws ServiceException, ParseException{  
             //数据访问层,通过email获取用户信息
            UserModel user=userDao.find(email);
            //验证用户是否存在 
            if(user!=null) {  
                //验证用户激活状态  
                if(user.getStatus()==0) { 
                    ///没激活
                    Date currentTime = new Date();//获取当前时间  
                    //验证链接是否过期 
                    currentTime.before(user.getRegisterTime());
                    if(currentTime.before(user.getLastActivateTime())) {  
                        //验证激活码是否正确  
                        if(validateCode.equals(user.getValidateCode())) {  
                            //激活成功, //并更新用户的激活状态,为已激活 
                            System.out.println("==sq==="+user.getStatus());
                            user.setStatus(1);//把状态改为激活
                            System.out.println("==sh==="+user.getStatus());
                            userDao.update(user);
                        } else {  
                           throw new ServiceException("激活码不正确");  
                        }  
                    } else { throw new ServiceException("激活码已过期!");  
                    }  
                } else {
                   throw new ServiceException("邮箱已激活,请登录!");  
                }  
            } else {
                throw new ServiceException("该邮箱未注册(邮箱地址不存在)!");  
            }  
    
        }
    }
    
    RegisterController.java代码
    package com.app.web.controller;
    import java.text.ParseException;
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.servlet.ModelAndView;
    import com.app.service.impl.RegisterValidateService;
    import com.app.tools.ServiceException;
    
    @Controller
    public class RegisterController {
    
        @Resource
        private RegisterValidateService service;
    
        @RequestMapping(value="/user/register",method={RequestMethod.GET,RequestMethod.POST})
        public ModelAndView  load(HttpServletRequest request,HttpServletResponse response) throws ParseException{
            String action = request.getParameter("action");
            System.out.println("-----r----"+action);
            ModelAndView mav=new ModelAndView();
            if("register".equals(action)) {
                //注册
                String email = request.getParameter("email");
                service.processregister(email);//发邮箱激活
                mav.addObject("text","注册成功");
                mav.setViewName("register/register_success");
            } 
            else if("activate".equals(action)) {
                //激活
                String email = request.getParameter("email");//获取email
                String validateCode = request.getParameter("validateCode");//激活码
    
                try {
                    service.processActivate(email , validateCode);//调用激活方法
                    mav.setViewName("register/activate_success");
                } catch (ServiceException e) {
                    request.setAttribute("message" , e.getMessage());
                    mav.setViewName("register/activate_failure");
                }
    
            }
            return mav;
        }
     
    }
    UserDao.java(这里个人没有做入库操作,只是利用集合,做过效果出来0_0) 
    package com.app.dao;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashMap;
    
    import org.springframework.stereotype.Repository;
    import com.code.model.UserModel;
    /**
     * 
     * @author Qixuan.Chen
     */
    @Repository
    public class UserDao {
    
       public HashMap<String, String> map=new HashMap<String, String>();
        /**
         * @保存注册信息
         *  private Long id;
            private String name;
            private String password;
            private String email;//注册账号
            private int status;//激活状态
            private String validateCode;//激活码
            private Date  registerTime;//注册时间
         */
        public void save(UserModel user){
            System.out.println("cicicici");
            map.put("id", String.valueOf(user.getId()));
            map.put("email", user.getEmail());
            map.put("validateCode", user.getValidateCode());
            SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddhhmmss");
            String time=sdf.format(user.getRegisterTime());
            map.put("registerTime", time);
            int status=user.getStatus();
            map.put("status", String.valueOf(status));
            map.put("name", user.getName());
            String t2=sdf.format(user.getLastActivateTime());
            map.put("activeLastTime", String.valueOf(t2));
            System.out.println("=======s========="+status);
    
        }
    
        /**
         * @更新 user
         */
        public void update(UserModel user){
            map.put("email", user.getEmail());
            map.put("validateCode", user.getValidateCode());
            Date time=user.getRegisterTime();
            map.put("registerTime", String.valueOf(time));
            int status=user.getStatus();
            map.put("status", String.valueOf(status));
            System.out.println("=======st========="+status);
        }
    
        /**
         * @throws ParseException 
         * @查找信息
         */
        public UserModel find(String email) throws ParseException{
            UserModel user=new UserModel();
            user.setEmail(map.get("email"));
            user.setName(map.get("name"));
            SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddhhmmss");
            Date day=sdf.parse(map.get("registerTime"));
            user.setRegisterTime(day);
            user.setStatus(Integer.valueOf(map.get("status")));
            user.setValidateCode(map.get("validateCode"));
            return user;
        }
    }
    
    UserModel.java 
    package com.code.model;
    import java.beans.Transient;
    import java.util.Calendar;
    import java.util.Date;
    
    public class UserModel {
        private Long id;
     private String name;
     private String password;
     private String email;//注册账号
     private int status=0;//激活状态
     private String validateCode;//激活码
     private Date  registerTime;//注册时间
    
        
        /////////////////
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public int getStatus() {
            return status;
        }
    
        public void setStatus(int status) {
            this.status = status;
        }
    
        public String getValidateCode() {
            return validateCode;
        }
    
        public void setValidateCode(String validateCode) {
            this.validateCode = validateCode;
        }
    
        public Date getRegisterTime() {
            return registerTime;
        }
    
        public void setRegisterTime(Date registerTime) {
            this.registerTime = registerTime;
        }
        /////////////////////////
        @Transient
        public Date getLastActivateTime() {
            Calendar cl = Calendar.getInstance();
            cl.setTime(registerTime);
            cl.add(Calendar.DATE , 2);
    
            return cl.getTime();
        }
    
    }
    
    SendEmail.java文件
    package com.app.tools;
    import java.util.Date;
    import java.util.Properties;
    import javax.mail.Authenticator;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.PasswordAuthentication;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    
    /**
     * 
     * @author Qixuan.Chen
     */
    public class SendEmail {
    
        public static final String HOST = "smtp.163.com";
        public static final String PROTOCOL = "smtp";   
        public static final int PORT = 25;
        public static final String FROM = "xxxxx@xx.com";//发件人的email
        public static final String PWD = "123456";//发件人密码
    
        /**
         * 获取Session
         * @return
         */
        private static Session getSession() {
            Properties props = new Properties();
            props.put("mail.smtp.host", HOST);//设置服务器地址
            props.put("mail.store.protocol" , PROTOCOL);//设置协议
            props.put("mail.smtp.port", PORT);//设置端口
            props.put("mail.smtp.auth" , true);
    
            Authenticator authenticator = new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(FROM, PWD);
                }
    
            };
            Session session = Session.getDefaultInstance(props , authenticator);
    
            return session;
        }
    
        public static void send(String toEmail , String content) {
            Session session = getSession();
            try {
                System.out.println("--send--"+content);
                // Instantiate a message
                Message msg = new MimeMessage(session);
    
                //Set message attributes
                msg.setFrom(new InternetAddress(FROM));
                InternetAddress[] address = {new InternetAddress(toEmail)};
                msg.setRecipients(Message.RecipientType.TO, address);
                msg.setSubject("账号激活邮件");
                msg.setSentDate(new Date());
                msg.setContent(content , "text/html;charset=utf-8");
    
                //Send the message
                Transport.send(msg);
            }
            catch (MessagingException mex) {
                mex.printStackTrace();
            }
        }
    }
    
    MD5Util.java 文件
    package com.app.tools;
    import java.io.UnsupportedEncodingException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    public class MD5Util {
    
     /**
      * 将源字符串使用MD5加密为字节数组
      * @param source
      * @return
      */
     public static byte[] encode2bytes(String source) {
      byte[] result = null;
      try {
       MessageDigest md = MessageDigest.getInstance("MD5");
       md.reset();
       md.update(source.getBytes("UTF-8"));
       result = md.digest();
      } catch (NoSuchAlgorithmException e) {
       e.printStackTrace();
      } catch (UnsupportedEncodingException e) {
       e.printStackTrace();
      }
    
      return result;
     }
    
     /**
      * 将源字符串使用MD5加密为32位16进制数
      * @param source
      * @return
      */
     public static String encode2hex(String source) {
      byte[] data = encode2bytes(source);
      StringBuffer hexString = new StringBuffer();
      for (int i = 0; i < data.length; i++) {
       String hex = Integer.toHexString(0xff & data[i]);
    
       if (hex.length() == 1) {
        hexString.append('0');
       }
    
       hexString.append(hex);
      }
    
      return hexString.toString();
     }
    
     /**
      * 验证字符串是否匹配
      * @param unknown 待验证的字符串
      * @param okHex 使用MD5加密过的16进制字符串
      * @return 匹配返回true,不匹配返回false
      */
     public static boolean validate(String unknown , String okHex) {
      return okHex.equals(encode2hex(unknown));
     }
    
    }
    
    ServiceException.java 
    package com.app.tools;
    public class ServiceException extends Exception {
     private static final long serialVersionUID = -1708015121235851228L;
    
     public ServiceException(String message) {
      super(message);
     }
    }
    
    jsp页面
    1、registerEmailValidae.jsp
    <h2>注册激活</h2>
        <form action="user/register?action=register" method="post">
            Email:<input type="text" id="email" name="email" value="" >
            <input type="submit" value="提交">
        </form>
    2、register_success.jsp
     <body>
        恭喜你注册成功!请到注册的邮箱点击链接激活!
      </body>
    3、activate_success.jsp
    <body>
        账号激活成功,点击这里去登录!
      </body>
    4、activate_failure.jsp:
    <body>
        激活失败!错误信息:${message }
      </body>
  • 相关阅读:
    Python高级网络编程系列之第二篇
    Python高级网络编程系列之第一篇
    Python高级网络编程系列之基础篇
    利用Python实现12306爬虫--查票
    Linux Shell脚本欣赏
    Linux Shell脚本 之 条件判断
    VMware Workstation虚拟网络VMnet0、VMnet1、VMnet8的图解
    Linux的虚拟机采用NAT方式时如何能在虚拟机中访问互联网
    Linux的虚拟机拷贝到另外的操作系统时,NAT方式的静态IP无效,一直是获取的DHCP动态地址
    Hadoop
  • 原文地址:https://www.cnblogs.com/xyk1987/p/8476337.html
Copyright © 2011-2022 走看看