zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java注册邮箱激活验证实现代码

JAVA注册代码 实现 激活 验证 邮箱
2023-06-13 09:15:14 时间

最近从项目分离出来的注册邮箱激活功能,整理一下,方便下次使用

RegisterValidateService.java

复制代码代码如下:


packagecom.app.service.impl;

importjava.text.ParseException;
importjava.util.Date;

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;

importcom.app.dao.UserDao;
importcom.app.tools.MD5Tool;
importcom.app.tools.MD5Util;
importcom.app.tools.SendEmail;
importcom.app.tools.ServiceException;
importcom.code.model.UserModel;


/**
 *
 *@authorQixuan.Chen
 */
@Service
publicclassRegisterValidateService{

   @Autowired
   privateUserDaouserDao;

   /**
    *处理注册
    */

   publicvoidprocessregister(Stringemail){
       UserModeluser=newUserModel();
       Longas=5480l;
       user.setId(as);
       user.setName("xiaoming");
       user.setPassword("324545");
       user.setEmail(email);
       user.setRegisterTime(newDate());
       user.setStatus(0);
       ///如果处于安全,可以将激活码处理的更复杂点,这里我稍做简单处理
       //user.setValidateCode(MD5Tool.MD5Encrypt(email));
       user.setValidateCode(MD5Util.encode2hex(email));

       userDao.save(user);//保存注册信息

       ///邮件的内容
       StringBuffersb=newStringBuffer("点击下面链接激活账号,48小时生效,否则重新注册账号,链接只能使用一次,请尽快激活!</br>");
       sb.append("<ahref=\"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("发送邮件");

   }

   /**
    *处理激活
    *@throwsParseException
    */
     ///传递激活码和email过来
   publicvoidprocessActivate(Stringemail,StringvalidateCode)throwsServiceException,ParseException{ 
        //数据访问层,通过email获取用户信息
       UserModeluser=userDao.find(email);
       //验证用户是否存在
       if(user!=null){ 
           //验证用户激活状态 
           if(user.getStatus()==0){
               ///没激活
               DatecurrentTime=newDate();//获取当前时间 
               //验证链接是否过期
               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{ 
                      thrownewServiceException("激活码不正确"); 
                   } 
               }else{thrownewServiceException("激活码已过期!"); 
               } 
           }else{
              thrownewServiceException("邮箱已激活,请登录!"); 
           } 
       }else{
           thrownewServiceException("该邮箱未注册(邮箱地址不存在)!"); 
       } 

   }

}

RegisterController.java

复制代码代码如下:


packagecom.app.web.controller;

importjava.text.ParseException;

importjavax.annotation.Resource;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;

importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importorg.springframework.web.servlet.ModelAndView;

importcom.app.service.impl.RegisterValidateService;
importcom.app.tools.ServiceException;


@Controller
publicclassRegisterController{

   @Resource
   privateRegisterValidateServiceservice;

   @RequestMapping(value="/user/register",method={RequestMethod.GET,RequestMethod.POST})
   publicModelAndView load(HttpServletRequestrequest,HttpServletResponseresponse)throwsParseException{
       Stringaction=request.getParameter("action");
       System.out.println("-----r----"+action);
       ModelAndViewmav=newModelAndView();

       if("register".equals(action)){
           //注册
           Stringemail=request.getParameter("email");
           service.processregister(email);//发邮箱激活
           mav.addObject("text","注册成功");
           mav.setViewName("register/register_success");
       }
       elseif("activate".equals(action)){
           //激活
           Stringemail=request.getParameter("email");//获取email
           StringvalidateCode=request.getParameter("validateCode");//激活码

           try{
               service.processActivate(email,validateCode);//调用激活方法
               mav.setViewName("register/activate_success");
           }catch(ServiceExceptione){
               request.setAttribute("message",e.getMessage());
               mav.setViewName("register/activate_failure");
           }

       }
       returnmav;
   }
   

}

UserDao.java(这里个人没有做入库操作,只是利用集合,做过效果出来0_0)

复制代码代码如下:
packagecom.app.dao;


importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjava.util.HashMap;


importorg.springframework.stereotype.Repository;

importcom.code.model.UserModel;

/**
 *
 *@authorQixuan.Chen
 */
@Repository
publicclassUserDao{

  publicHashMap<String,String>map=newHashMap<String,String>();
   /**
    *@保存注册信息
    * privateLongid;
       privateStringname;
       privateStringpassword;
       privateStringemail;//注册账号
       privateintstatus;//激活状态
       privateStringvalidateCode;//激活码
       privateDate registerTime;//注册时间
    */
   publicvoidsave(UserModeluser){
       System.out.println("cicicici");
       map.put("id",String.valueOf(user.getId()));
       map.put("email",user.getEmail());
       map.put("validateCode",user.getValidateCode());
       SimpleDateFormatsdf=newSimpleDateFormat("yyyyMMddhhmmss");
       Stringtime=sdf.format(user.getRegisterTime());
       map.put("registerTime",time);
       intstatus=user.getStatus();
       map.put("status",String.valueOf(status));
       map.put("name",user.getName());
       Stringt2=sdf.format(user.getLastActivateTime());
       map.put("activeLastTime",String.valueOf(t2));
       System.out.println("=======s========="+status);

   }

   /**
    *@更新user
    */
   publicvoidupdate(UserModeluser){
       map.put("email",user.getEmail());
       map.put("validateCode",user.getValidateCode());
       Datetime=user.getRegisterTime();
       map.put("registerTime",String.valueOf(time));
       intstatus=user.getStatus();
       map.put("status",String.valueOf(status));
       System.out.println("=======st========="+status);
   }

   /**
    *@throwsParseException
    *@查找信息
    */
   publicUserModelfind(Stringemail)throwsParseException{
       UserModeluser=newUserModel();
       user.setEmail(map.get("email"));
       user.setName(map.get("name"));
       SimpleDateFormatsdf=newSimpleDateFormat("yyyyMMddhhmmss");
       Dateday=sdf.parse(map.get("registerTime"));
       user.setRegisterTime(day);
       user.setStatus(Integer.valueOf(map.get("status")));
       user.setValidateCode(map.get("validateCode"));

       returnuser;
   }

}

UserModel.java

复制代码代码如下:
packagecom.code.model;

importjava.beans.Transient;
importjava.util.Calendar;
importjava.util.Date;


publicclassUserModel{
   privateLongid;
 privateStringname;
 privateStringpassword;
 privateStringemail;//注册账号
 privateintstatus=0;//激活状态
 privateStringvalidateCode;//激活码
 privateDate registerTime;//注册时间

   
   /////////////////

   publicLonggetId(){
       returnid;
   }

   publicvoidsetId(Longid){
       this.id=id;
   }

   publicStringgetName(){
       returnname;
   }

   publicvoidsetName(Stringname){
       this.name=name;
   }

   publicStringgetPassword(){
       returnpassword;
   }

   publicvoidsetPassword(Stringpassword){
       this.password=password;
   }

   publicStringgetEmail(){
       returnemail;
   }

   publicvoidsetEmail(Stringemail){
       this.email=email;
   }

   publicintgetStatus(){
       returnstatus;
   }

   publicvoidsetStatus(intstatus){
       this.status=status;
   }

   publicStringgetValidateCode(){
       returnvalidateCode;
   }

   publicvoidsetValidateCode(StringvalidateCode){
       this.validateCode=validateCode;
   }

   publicDategetRegisterTime(){
       returnregisterTime;
   }

   publicvoidsetRegisterTime(DateregisterTime){
       this.registerTime=registerTime;
   }

   /////////////////////////
   @Transient
   publicDategetLastActivateTime(){
       Calendarcl=Calendar.getInstance();
       cl.setTime(registerTime);
       cl.add(Calendar.DATE,2);

       returncl.getTime();
   }

}

SendEmail.java

复制代码代码如下:
packagecom.app.tools;

importjava.util.Date;
importjava.util.Properties;

importjavax.mail.Authenticator;
importjavax.mail.Message;
importjavax.mail.MessagingException;
importjavax.mail.PasswordAuthentication;
importjavax.mail.Session;
importjavax.mail.Transport;
importjavax.mail.internet.InternetAddress;
importjavax.mail.internet.MimeMessage;


/**
 *
 *@authorQixuan.Chen
 */
publicclassSendEmail{

   publicstaticfinalStringHOST="smtp.163.com";
   publicstaticfinalStringPROTOCOL="smtp";  
   publicstaticfinalintPORT=25;
   publicstaticfinalStringFROM="xxxxx@xx.com";//发件人的email
   publicstaticfinalStringPWD="123456";//发件人密码

   /**
    *获取Session
    *@return
    */
   privatestaticSessiongetSession(){
       Propertiesprops=newProperties();
       props.put("mail.smtp.host",HOST);//设置服务器地址
       props.put("mail.store.protocol",PROTOCOL);//设置协议
       props.put("mail.smtp.port",PORT);//设置端口
       props.put("mail.smtp.auth",true);

       Authenticatorauthenticator=newAuthenticator(){

           @Override
           protectedPasswordAuthenticationgetPasswordAuthentication(){
               returnnewPasswordAuthentication(FROM,PWD);
           }

       };
       Sessionsession=Session.getDefaultInstance(props,authenticator);

       returnsession;
   }

   publicstaticvoidsend(StringtoEmail,Stringcontent){
       Sessionsession=getSession();
       try{
           System.out.println("--send--"+content);
           //Instantiateamessage
           Messagemsg=newMimeMessage(session);

           //Setmessageattributes
           msg.setFrom(newInternetAddress(FROM));
           InternetAddress[]address={newInternetAddress(toEmail)};
           msg.setRecipients(Message.RecipientType.TO,address);
           msg.setSubject("账号激活邮件");
           msg.setSentDate(newDate());
           msg.setContent(content,"text/html;charset=utf-8");

           //Sendthemessage
           Transport.send(msg);
       }
       catch(MessagingExceptionmex){
           mex.printStackTrace();
       }
   }

}

MD5Util.java

复制代码代码如下:
packagecom.app.tools;

importjava.io.UnsupportedEncodingException;
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;

publicclassMD5Util{

 /**
 *将源字符串使用MD5加密为字节数组
 *@paramsource
 *@return
 */
 publicstaticbyte[]encode2bytes(Stringsource){
  byte[]result=null;
  try{
   MessageDigestmd=MessageDigest.getInstance("MD5");
   md.reset();
   md.update(source.getBytes("UTF-8"));
   result=md.digest();
  }catch(NoSuchAlgorithmExceptione){
   e.printStackTrace();
  }catch(UnsupportedEncodingExceptione){
   e.printStackTrace();
  }

  returnresult;
 }

 /**
 *将源字符串使用MD5加密为32位16进制数
 *@paramsource
 *@return
 */
 publicstaticStringencode2hex(Stringsource){
  byte[]data=encode2bytes(source);

  StringBufferhexString=newStringBuffer();
  for(inti=0;i<data.length;i++){
   Stringhex=Integer.toHexString(0xff&data[i]);

   if(hex.length()==1){
    hexString.append("0");
   }

   hexString.append(hex);
  }

  returnhexString.toString();
 }

 /**
 *验证字符串是否匹配
 *@paramunknown待验证的字符串
 *@paramokHex 使用MD5加密过的16进制字符串
 *@return 匹配返回true,不匹配返回false
 */
 publicstaticbooleanvalidate(Stringunknown,StringokHex){
  returnokHex.equals(encode2hex(unknown));
 }

}

ServiceException.java

复制代码代码如下:
packagecom.app.tools;

publicclassServiceExceptionextendsException{
 privatestaticfinallongserialVersionUID=-1708015121235851228L;

 publicServiceException(Stringmessage){
  super(message);
 }
}

jsp页面

registerEmailValidae.jsp

复制代码代码如下:
  <h2>注册激活</h2>
   <formaction="user/register?action=register"method="post">
       Email:<inputtype="text"id="email"name="email"value="">
       <inputtype="submit"value="提交">
   </form>

register_success.jsp

复制代码代码如下:
 <body>
   恭喜你注册成功!请到注册的邮箱点击链接激活!
 </body>

activate_success.jsp:

复制代码代码如下:
 <body>
   账号激活成功,点击这里去登录!
 </body>


activate_failure.jsp:

<body>
   激活失败!错误信息:${message}
 </body>


效果图:
1

2

3

4

5