验证码有效期300 s,验证码错误次数校验3 times,验证码获取间隔60s,每个用户数据库只存一条code记录
id
account 用户账号
code 验证码
times 验证错误次数
date_entered 创建时间
date_code_modified 验证码修改时间
date_times_modified 上次错误校验时间
@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);
}
/**
*
*/
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
/**
*
*/
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;
}
}
}