发送邮箱验证码及session校验(前后台代码) - 示例参考
Java发送邮箱验证码、session校验功能

更新时间为 2018 年 02 月 09 日 11 时 06 分 43 秒,作者是#城市之光。
本篇主要对“发送邮箱验证码、session 校验”相关的前台(html\js)代码和后台(java)代码进行描述,同时给出业务逻辑示例,有需要的朋友可以参考。
本篇主要描述与“发送邮箱验证码、session 校验”相关的前台(html\js)代码和后台(java)代码,以及业务逻辑示例,不多说废话,直接呈现代码。
1、引入的jar包是mail-1.4.jar
2、java底层发送邮箱方法
public boolean sendEMail(Mapmap) { log.info("電子郵件接口執行開始!"); Cache.getInstance().getParamsConstant.EMAIL_FROM 这个字符串被赋值给了 from 变量。 获取缓存实例,通过该实例获取参数,参数名为 Constant.EMAIL_PWD,获取到的参数赋值给字符串 pwd。 获取到的键为"mail"的值,将其转换为字符串形式并赋值给变量 to 。 获取到的键为"subject"的值,将其转换为字符串类型并赋值给变量 subject。 从 map 中获取名为“content”的值,然后将其转换为字符串并赋值给 content 变量。 Cache 实例获取的参数中,有一个名为 Constant.EMAIL_SMTPHOST 的参数,其值被赋给了字符串 smtpHost 。 如果字符串 to 为空或者为空白字符串,或者字符串 subject 为空或者为空白字符串,或者字符串 content 为空或者为空白字符串,那么就会执行以下操作。 log.info("内容有为空项,不符合发送条件,内容为:" + content); return false; } try{ 创建了一个名为 props 的 Properties 对象。 props 设置了属性“mail.transport.protocol”,其值为“smtp”;这是 JavaMail 规范所要求使用的协议。 props 将属性“mail.smtp.host”设置为 smtpHost;这是用于设置发件人的邮箱的 SMTP 服务器地址的操作 props 设定了一个属性,该属性名为 "mail.smtp.auth",其值为 "true";此操作是为了请求认证,而参数名称与具体的实现相关。 // 创建Session实例对象 Session 被获取到,获取的方式是通过调用 Session.getDefaultInstance(props) 这个方法,获取到的 Session 被赋值给了 session 这个变量。 // 创建MimeMessage实例对象 创建了一个 MimeMessage 对象,这个对象名为 message,并且是基于 session 来创建的。 // 设置发件人 message 设定了发送者为新的 InternetAddress(from); // 设置收件人 message 设定接收者(Message.RecipientType.TO),通过 InternetAddress.parse(to) 来进行设置。 // 设置发送日期 message 被设置了发送日期,这个发送日期是新的日期对象,即 new Date()。 // 设置邮件主题 message.setSubject(subject); // 设置纯文本内容的邮件正文 message.setText(content); // 保存并生成最终的邮件内容 message.saveChanges(); // 设置为debug模式, 可以查看详细的发送 log session.setDebug(true); // 获取Transport对象 Transport 被赋值为 session 获取到的名为“smtp”的传输方式。 第 2 个参数需填写的是 QQ 邮箱的 SMTP 的授权码。什么是授权码呢?它又是怎样进行设置的呢? transport.connect(from, pwd); 发送时,通过 message.getAllRecipients() 获取到的是在创建邮件对象时添加的那些收件人、抄送人以及密送人。 transport 发送消息(message),并将消息发送给消息的所有接收者(message.getAllRecipients())。 transport.close(); }catch(Exception e){ log.error(e.getMessage(), e); return false; } log.info("電子郵件接口執行完成,執行成功!"); return true; }
java 的业务逻辑层会进行调用,以发送邮箱。同时,验证码会被加密并存储在 session 中。
使用 @RequestMapping 注解来映射路径为 "/sendEMail.do" 的请求。 该注解用于指定处理特定 HTTP 请求的方法。 在这里,它指定了处理发送电子邮件的请求的路径。 当接收到匹配该路径的请求时,相关的处理方法将被调用。
在这个公共方法中,接收了一个 HttpServletRequest 请求对象和一个 HttpServletResponse 响应对象,用于发送电子邮件。
这个字符串包含了一些信息,其中 success 的值为 false ,message 的值是"操作失败",returnVal 的值为空字符串。
boolean res = false;//发送邮件标记
Map map = new HashMap();
try {
从请求中获取名为“username”的参数,并将其赋值给字符串变量 username。
this.userService 找到用户名对应的用户,该用户被赋值给 User user,用户名是 username。
if(null == user){
json 的内容为:{"success":false,"message":"无此人员","returnVal":""}
return;
}
//获取当前绑定邮箱地址
获取用户的邮箱,将其赋值给字符串 mail 。
//验证邮箱地址
如果字符串工具类 StringUtils 判断邮件为空或者字符串 "null" 与邮件相等,则执行以下操作。
json 表示的内容为:其“success”字段为 false,“message”字段的值是“当前用户尚未绑定邮箱”,“returnVal”字段为空字符串。
return;
}
//生成验证码
获取验证码的操作,其结果存储在字符串 checkcode 中,该验证码是通过 Common 类的 getCode 方法获取到的。
//发送验证码
Cache.getInstance().获取参数(Constant.UIAS_DEBUG),结果赋值给 String _debug 。
如果“1”等于_debug,那么在调试模式下,不会真正发送,而是直接回显。
map 将 "checkcode" 这个键与 checkcode 这个值进行关联。
res = true;
}else{//非调试模式 真实发送邮件
//验证是否频繁发送验证码请求 单位 秒
Cache.getInstance().获取参数(Constant.EMAIL_INTERVAL_TIME),并将其赋值给字符串 intervalTime 。
从请求的会话中获取名为“emailTimeFlag”的属性,将其赋值给对象 emailTimeFlag 。
boolean checkTime = true;
if (emailTimeFlag != null) {
获取当前时间的毫秒数并赋值给变量 miao,将其转换为整数类型。获取存储的邮件时间标记并转换为长整型,然后用当前时间的毫秒数减去邮件时间标记的毫秒数,再除以 1000 得到秒数并赋值给变量 miao。
if (miao <= Integer.parseInt(intervalTime)) {
checkTime=false;
}
}
if(checkTime){
//组装数据
Cache.getInstance().获取参数(Constant.EMAIL_VALIDITY)得到字符串 email_validity 。
String vartime= String.valueOf((Integer.parseInt(email_validity)/60000));
String content = Cache.getInstance().getParams(Constant.EMAIL_CONTENT);
String subject = Cache.getInstance().getParams(Constant.EMAIL_SUBJECT);
content = content.replaceAll("\\$code", checkcode);
content = content.replaceAll("\\$time",vartime);
map.put("mail", mail);
map.put("subject", subject);
map.put("content", content);
//调用发送
res = ieMailService.sendEMail(map);
}else{
json = "{\"success\":false,\"message\":\"请耐心等待,不要频繁发送验证码申请\",\"returnVal\":\"\"}";
return;
}
}
//发送成功后续操作
if(res){
//把验证时间放在session里
request.getSession().setAttribute("emailTimeFlag", new Date().getTime());
//把验证码放在session里 md5 2次加密验证码
String codeMd5 = DigestUtils.md5Hex((DigestUtils.md5Hex(checkcode).toLowerCase()));
request.getSession().setAttribute("emailCodeFlag", codeMd5);
if("1".equals(_debug)){
json = "{\"success\":true,\"message\":\"邮箱验证码发送成功,已经待填到验证码框!\",\"returnVal\":\"\",\"checkcode\":\""+checkcode+"\"}";
}else{
json = "{\"success\":true,\"message\":\"邮箱验证码发送成功,请查收邮件!\",\"returnVal\":\"\"}";
}
}
} catch (Exception e) {
logger.error("发送邮件验证码异常", e);
}finally{
使用 response、json 和 "encoding:UTF-8" 来渲染 Html 。
}
}
java 用于验证邮箱,将 session 中的验证码与提交上来的验证码进行比对
@RequestMapping("/check.do")
公共的方法用于检查(HttpServletRequest 请求对象,HttpServletResponse 响应对象)。
String json = "{\"success\":false,\"message\":\"操作失败\",\"returnVal\":\"\"}";
try {
//验证码有效期校验
String email_validity = Cache.getInstance().getParams(Constant.EMAIL_VALIDITY);
从请求的会话中获取名为“emailTimeFlag”的属性,将其赋值给对象 emailTimeFlag。
if (emailTimeFlag != null) {
获取当前时间的毫秒数,将其赋值给变量 miao,计算当前时间与 emailTimeFlag 所表示时间的时间差(单位为毫秒),再将时间差除以 1000 得到秒数,最后将秒数转换为整数类型并赋值给变量 miao。
如果 miao 大于或等于将 email_validity 转换为整数后的值,那么
json 中包含两个部分,一是“success”为 false,二是“message”为“验证码已过有效期,请重新获取!”,同时“returnVal”为空字符串。
}else{
//在有效期内 比对验证码准确性
获取名为"checkcode"的参数值并赋值给字符串 checkcode,即 checkcode = request.getParameter("checkcode");
// md5 2次加密验证码
使用 DigestUtils 的 md5Hex 方法对 checkcode 进行加密,得到的结果再转换为小写形式,然后再次使用 DigestUtils 的 md5Hex 方法进行加密,最终得到的结果赋值给 String 类型的 codeMd5 变量。
从请求的会话中获取名为“emailCodeFlag”的属性,将其赋值给对象 emailCodeFlag 。
判断结果 res 为 codeMd5 是否等于将 emailCodeFlag 转换为字符串后的结果
if(res){
{"success": true, "message": "验证码通过!", "returnVal": ""}
}else{
json 表示的信息为:成功标志为 false,消息内容是验证码不匹配,请重新核对!返回值为空字符串""。
}
}
}
} catch (Exception e) {
logger.error("验证码异常", e);
}finally{
renderHtml(response, json, "encoding:UTF-8");
}
}
java 处理用于展示到页面的邮箱加*号隐藏的正则表达式;java 处理用于展示到页面的手机号加*号隐藏的正则表达式
// 括号表示组,被替换的部分$n表示第n组的内容
使用正则表达式将邮件地址中的用户名部分进行替换,将除开头和结尾的字符外的其他字符替换为星号,具体为:将"(\\w?)(\\w+)(\\w)(@\\w+\\.[a-z]+(\\.[a-z]+)?)"中的"(\\w?)(\\w+)(\\w)"替换为"$1****$3",保留"@\\w+\\.[a-z]+(\\.[a-z]+)?"部分不变。
// 括号表示组,被替换的部分$n表示第n组的内容
phone 进行了替换操作,将其中符合 "(\\d{3})\\d{4}(\\d{4})" 模式的部分替换为 "$1****$2" 。
6、HTML 获取验证码按钮
7、js 函数调用 按钮60秒倒计时
//获取邮箱验证码
function start_mail_button(){
获取用户名,获取的方式是获取 id 为“username”的元素的值,并对其进行去除两端空格的操作;获取到的用户名赋值给变量 username
if('' == username){
ErrorMsg("请输入用户名");
return;
}
$.ajax({
url 为 basePath+'/sendEMail.do',类型为 'post',数据类型为 'json'
data: {username: username},
success: function(data){
if(data.success){
SuccMsg(data.message);
//页面获取验证码按钮样式处理
$("#btnMail").attr("disabled", true); // 为 id 为 btnMail 的元素设置 disabled 属性为 true,使其不可用
var count = 1 ;
var sum = 60;
设置一个定时器,每隔一段时间就执行一个函数,这个函数会不断地被调用,直到满足某个条件或者被清除。在这个定时器中,通过一个变量 i 来控制定时器的执行和清除。具体来说,就是使用 setInterval 函数创建一个定时器,然后在定时器的回调函数中执行一些操作,最后可以使用 clearInterval 函数来清除这个定时器。
if(count > 60){
通过 jQuery 选择器获取到 id 为“btnMail”的元素,并将其 disabled 属性设置为 false,使其可点击。
$("#btnMail").val("获取邮箱验证码");
clearInterval(i);
}else{
$("#btnMail").val($("#btnMail").val() + "秒");
}
count++;
},1000);
//debug模式待填
if(data.checkcode){
$("#checkcode").获取到的数据赋值给 data.checkcode ,然后将其赋给 $("#checkcode").val() 。
}
}else{
获取失败了,获取到的信息是 data.message 。
}
}
});
}
8、提交验证码的js没什么特别的,就不上代码了。
总结
小编给大家介绍了 Java 发送邮箱验证码以及 session 校验功能。希望这些能对大家有所帮助。如果大家有疑问,可给我留言,我会及时回复。同时,非常感谢大家对脚本之家网站的支持。
« 上一篇
读懂中美儿童计算机教育改革差异:整体认知不同