系统登陆邮件验证码模块(功能+数据库设计+逻辑+代码)

系统登陆邮件验证码模块

    • 模块功能
    • 数据库设计
    • 逻辑流程图
      • 申请流程图
      • 校验流程图
    • 代码
      • BPO实现
      • BLO实现
      • DAO实现

模块功能

验证码有效期300 s,验证码错误次数校验3 times,验证码获取间隔60s,每个用户数据库只存一条code记录

数据库设计

id
account 用户账号
code 验证码
times 验证错误次数
date_entered 创建时间
date_code_modified 验证码修改时间
date_times_modified 上次错误校验时间

逻辑流程图

申请流程图

系统登陆邮件验证码模块(功能+数据库设计+逻辑+代码)_第1张图片

校验流程图

系统登陆邮件验证码模块(功能+数据库设计+逻辑+代码)_第2张图片

代码

BPO实现

   @Override
     @POST
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/getCode/wechat")
     @RestService
     public String applyCode(@Context HttpServletRequest  request,@Context HttpServletResponse response) {
           logger.info("获取验证码");
           String  userAccount=request.getParameter("userAccount");
           //userAccount 不为空校验
           if(userAccount==null||userAccount.equals(""))return  "508";
           if (userAccount.indexOf("@") != (-1)) {
                userAccount = userAccount.split("@")[0];
           }
           return codeBLO.applyCode(userAccount);
     }

BLO实现

/**
*
*/
package approvalcenter.sc.approvalcenter.dc.bo.impl;

import java.sql.Timestamp;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.neusoft.unieap.core.annotation.ModelFile;
import com.neusoft.unieap.core.util.ServletContextUtil;

import approvalcenter.sc.approvalcenter.dc.bo.CodeBLO;
import approvalcenter.sc.approvalcenter.dc.dao.CodeDAO;
import approvalcenter.sc.approvalcenter.dc.utils.LoadApprovalProp;
import approvalcenter.sc.approvalcenter.dc.utils.MailUtils;
import approvalcentersc.approvalcenterdc.entity.LaCode;

/**
* @author pwu
*
*/
@ModelFile(value = "CodeBLO.bo")
public class CodeBLOImpl implements CodeBLO {

    /**
     *
     */
    public CodeBLOImpl() {
        // TODO Auto-generated constructor stub
    }
    private CodeDAO codeDAO;
    private static final Log logger = LogFactory.getLog(CodeBLOImpl.class);
    public CodeDAO getCodeDAO() {
        return codeDAO;
    }
    public void setCodeDAO(CodeDAO codeDAO) {
        this.codeDAO = codeDAO;
    }
    @Override
    public String applyCode(String userAccount) {
        if (!LoadApprovalProp.isInitCodePropSuccess) {
            LoadApprovalProp.loadCodeProperties();
            }
        int applySeconds=Integer.valueOf(LoadApprovalProp.propCode.getProperty("applySeconds"));
        String result="200"+applySeconds;
        LaCode laCode=codeDAO.getCode(userAccount);
        logger.info("判断是否存在Code,不存在新建返回验证码,存在的话进行时间校验");
        //判断是否存在Code,不存在新建返回验证码,存在的话进行时间校验
        if(laCode.getId()!=null){
            Long s = getSeconds(laCode.getDateCodeModified());
            logger.info("超过3分钟更新Code,发送邮件");
            //超过3分钟更新Code,发送邮件
            if(s>=applySeconds){
                laCode.setCode(createCode());
                laCode.setDateCodeModified(new Timestamp(System.currentTimeMillis()));
                laCode.setTimes(0);
                if(codeDAO.update(laCode)){
                    logger.info("验证码邮件");
                    //验证码邮件
                    sendCodeEmail(laCode.getCode(),userAccount);
                }else result="500";
            }else {
                Long s2=applySeconds-s;
                result=s2.toString();
            }
        }else{
            LaCode newCode=new LaCode();
            newCode.setAccount(userAccount);
            newCode.setCode(createCode());
            newCode.setDateCodeModified(new Timestamp(System.currentTimeMillis()));
            newCode.setDateEntered(new Timestamp(System.currentTimeMillis()));
            newCode.setDateTimesModified(new Timestamp(System.currentTimeMillis()));
            newCode.setTimes(0);
            logger.info("Code保存成功,发送邮件");
            //Code保存成功,发送邮件
            if(codeDAO.saveCode(newCode)){
                logger.info("验证码邮件");
                //验证码邮件
                sendCodeEmail(newCode.getCode(),userAccount);
            }else result="500";
        }
        return result;
    }
    
    private String createCode(){
        return Integer.toString((int)(Math.random()*(9999-1000+1))+1000);
    }
    @Override
    public String validateCodeTotal(String code,String userAccount) {
        if (!LoadApprovalProp.isInitCodePropSuccess) {
            LoadApprovalProp.loadCodeProperties();
            }
        int errorTimes=Integer.valueOf(LoadApprovalProp.propCode.getProperty("errorTimes"));
        int errorSeconds=Integer.valueOf(LoadApprovalProp.propCode.getProperty("errorSeconds"));
        String result="200";
        LaCode laCode=codeDAO.getCode(userAccount);
        //系统错误,该用户未生成验证码请重新获取
        if(laCode==null)return  "509";
        //验证次数小于3次,进行验证;验证次数大于3次进行是否禁止验证判断
        if(laCode.getTimes()=errorSeconds){
                laCode.setTimes(0);
                result= validateCode(laCode,code);
                result=result+laCode.getTimes();
            }else {
                Long s2=errorSeconds-s;
                result=s2.toString();
                result= "510"+result;
            }
        }
        return result;
    }
    /**
     * 获取当前系统时间与传入时间的时间间隔
     * @param time
     * @return
     */
    private long getSeconds(Timestamp time){
        long dt=System.currentTimeMillis();
        long tCode = time.getTime();
        Long s = (dt - tCode) / (1000);
        return s;
    }
    /**
     *  验证码验证
     * //验证正确 重置验证次数 返回 200,验证错误 验证次数+1 返回 201
     * @param laCode
     * @param code
     * @return
     */
    private String validateCode(LaCode laCode,String code){
        int codeAvailable=Integer.valueOf(LoadApprovalProp.propCode.getProperty("codeAvailable"));
        laCode.setDateTimesModified(new Timestamp(System.currentTimeMillis()));
        Long s = getSeconds(laCode.getDateCodeModified());
        //首先判断验证码是否有效,验证正确 重置验证次数 返回 200,验证错误 验证次数+1 返回 201
        if(s

DAO实现

/**
 * 
 */
package approvalcenter.sc.approvalcenter.dc.dao.impl;

import java.util.List;

import com.neusoft.unieap.core.annotation.ModelFile;
import com.neusoft.unieap.core.base.dao.BaseHibernateDAO;

import approvalcenter.sc.approvalcenter.dc.dao.CodeDAO;
import approvalcenter.sc.approvalcenter.common.entity.LaCode;

/**
 * @author pwu
 *
 */
@ModelFile(value = "CodeDAO.dao")
public class CodeDAOImpl extends BaseHibernateDAO implements CodeDAO {

	/**
	 * 
	 */
	public CodeDAOImpl() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public LaCode getCode(String userAccount) {
		LaCode co= new LaCode();
		List result= getHibernateTemplate().find("From LaCode where account='"+userAccount+"'");
		if(result.size()>0){
			return result.get(0);
		}else return co;
	}

	@Override
	public boolean update(LaCode code) {
		try {
			this.getHibernateTemplate().update(code);
			 return true;
		} catch (Exception e) {
			e.printStackTrace();
			 return false;
		}
	}

	@Override
	public boolean saveCode(LaCode newCode) {
		try {
			this.getHibernateTemplate().save(newCode);
			 return true;
		} catch (Exception e) {
			e.printStackTrace();
			 return false;
		}
	}
	

}

你可能感兴趣的:(JAVA)