Java发送邮箱验证码、session校验功能
作者:#城市之光 发布时间:2023-09-11 02:44:21
标签:邮箱,验证码,session,校验
本篇主要描述“发送邮箱验证码、session校验”相关前(html\js)后(java)台代码,业务逻辑示例,闲话少诉,直接上代码。
1、引入的jar包是mail-1.4.jar
2、java底层发送邮箱方法
public boolean sendEMail(Map<String, Object> map) {
log.info("電子郵件接口執行開始!");
String from = Cache.getInstance().getParamsConstant.EMAIL_FROM);
String pwd = Cache.getInstance().getParams(Constant.EMAIL_PWD);
String to = String.valueOf(map.get("mail"));
String subject = String.valueOf(map.get("subject"));
String content = String.valueOf(map.get("content"));
String smtpHost = Cache.getInstance().getParams(Constant.EMAIL_SMTPHOST);
if(StringUtils.isBlank(to) || StringUtils.isBlank(subject) || StringUtils.isBlank(content)){
log.info("郵件地址("+to+")、主題("+subject+")、內容("+content+")有為空項,不符合發送條件");
return false;
}
try{
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", smtpHost); // 发件人的邮箱的 SMTP服务器地址
props.setProperty("mail.smtp.auth", "true"); // 请求认证,参数名称与具体实现有关
// 创建Session实例对象
Session session = Session.getDefaultInstance(props);
// 创建MimeMessage实例对象
MimeMessage message = new MimeMessage(session);
// 设置发件人
message.setFrom(new InternetAddress(from));
// 设置收件人
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
// 设置发送日期
message.setSentDate(new Date());
// 设置邮件主题
message.setSubject(subject);
// 设置纯文本内容的邮件正文
message.setText(content);
// 保存并生成最终的邮件内容
message.saveChanges();
// 设置为debug模式, 可以查看详细的发送 log
session.setDebug(true);
// 获取Transport对象
Transport transport = session.getTransport("smtp");
// 第2个参数需要填写的是QQ邮箱的SMTP的授权码,什么是授权码,它又是如何设置?
transport.connect(from, pwd);
// 发送,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}catch(Exception e){
log.error(e.getMessage(), e);
return false;
}
log.info("電子郵件接口執行完成,執行成功!");
return true;
}
3、java业务逻辑层调用发送邮箱、验证码加密存储在session中
@RequestMapping("/sendEMail.do")
public void sendEMail(HttpServletRequest request, HttpServletResponse response) {
String json = "{\"success\":false,\"message\":\"操作失败\",\"returnVal\":\"\"}";
boolean res = false;//发送邮件标记
Map<String, Object> map = new HashMap<String, Object>();
try {
String username = request.getParameter("username");
User user = this.userService.findUserByLoginname(username);
if(null == user){
json = "{\"success\":false,\"message\":\"无此人员\",\"returnVal\":\"\"}";
return;
}
//获取当前绑定邮箱地址
String mail = user.getEmail();
//验证邮箱地址
if(StringUtils.isBlank(mail) || "null".equals(mail)){
json = "{\"success\":false,\"message\":\"当前用户尚未绑定邮箱\",\"returnVal\":\"\"}";
return;
}
//生成验证码
String checkcode = Common.getCode();
//发送验证码
String _debug = Cache.getInstance().getParams(Constant.UIAS_DEBUG);
if("1".equals(_debug)){//调试模式 不真发送 直接回显
map.put("checkcode", checkcode);
res = true;
}else{//非调试模式 真实发送邮件
//验证是否频繁发送验证码请求 单位 秒
String intervalTime = Cache.getInstance().getParams(Constant.EMAIL_INTERVAL_TIME);
Object emailTimeFlag = request.getSession().getAttribute("emailTimeFlag");
boolean checkTime = true;
if (emailTimeFlag != null) {
int miao = (int) (((new Date()).getTime() - (Long) emailTimeFlag) / 1000);
if (miao <= Integer.parseInt(intervalTime)) {
checkTime=false;
}
}
if(checkTime){
//组装数据
String email_validity = Cache.getInstance().getParams(Constant.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{
renderHtml(response, json, "encoding:UTF-8");
}
}
4、java验证邮箱,比对session中的验证码和提交上来的验证码
@RequestMapping("/check.do")
public void check(HttpServletRequest request, HttpServletResponse response) {
String json = "{\"success\":false,\"message\":\"操作失败\",\"returnVal\":\"\"}";
try {
//验证码有效期校验
String email_validity = Cache.getInstance().getParams(Constant.EMAIL_VALIDITY);
Object emailTimeFlag = request.getSession().getAttribute("emailTimeFlag");
if (emailTimeFlag != null) {
int miao = (int) (((new Date()).getTime() - (Long) emailTimeFlag) / 1000);
if (miao >= Integer.parseInt(email_validity)) {
json = "{\"success\":false,\"message\":\"验证码已过有效期,请重新获取!\",\"returnVal\":\"\"}";
}else{
//在有效期内 比对验证码准确性
String checkcode = request.getParameter("checkcode");
// md5 2次加密验证码
String codeMd5 = DigestUtils.md5Hex((DigestUtils.md5Hex(checkcode).toLowerCase()));
Object emailCodeFlag = request.getSession().getAttribute("emailCodeFlag");
boolean res = codeMd5.equals(String.valueOf(emailCodeFlag));
if(res){
json = "{\"success\":true,\"message\":\"验证码通过!\",\"returnVal\":\"\"}";
}else{
json = "{\"success\":false,\"message\":\"验证码不匹配,请重新核对!\",\"returnVal\":\"\"}";
}
}
}
} catch (Exception e) {
logger.error("验证码异常", e);
}finally{
renderHtml(response, json, "encoding:UTF-8");
}
}
5、小插曲,java处理要展示到页面的邮箱和手机号加*号隐藏的正则表达式
// 括号表示组,被替换的部分$n表示第n组的内容
mail = mail.replaceAll("(\\w?)(\\w+)(\\w)(@\\w+\\.[a-z]+(\\.[a-z]+)?)", "$1****$3$4");
// 括号表示组,被替换的部分$n表示第n组的内容
phone = phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
6、HTML 获取验证码按钮
<input id="btnMail" type="button" onclick="start_mail_button();" value="获取邮件验证码" />
7、js 函数调用 按钮60秒倒计时
//获取邮箱验证码
function start_mail_button(){
var username = $('#username').val().trim();//用戶名
if('' == username){
ErrorMsg("请输入用户名");
return;
}
$.ajax({
url: basePath+'/sendEMail.do',type: 'post',dataType: 'json',
data: {username: username},
success: function(data){
if(data.success){
SuccMsg(data.message);
//页面获取验证码按钮样式处理
$("#btnMail").attr('disabled','disabled');
var count = 1 ;
var sum = 60;
var i = setInterval(function(){
if(count > 60){
$("#btnMail").attr('disabled',false);
$("#btnMail").val("获取邮箱验证码");
clearInterval(i);
}else{
$("#btnMail").val("剩余"+parseInt(sum - count)+'秒');
}
count++;
},1000);
//debug模式待填
if(data.checkcode){
$("#checkcode").val(data.checkcode);
}
}else{
ErrorMsg("获取失败!"+data.message);
}
}
});
}
8、提交验证码的js没什么特别的,就不上代码了。
总结
以上所述是小编给大家介绍的Java发送邮箱验证码、session校验功能网站的支持!
来源:https://www.cnblogs.com/city-light/archive/2018/02/09/8434442.html
0
投稿
猜你喜欢
- 纯Java代码模拟Hibernate一级缓存原理,简单易懂。import java.util.ArrayList;import java.u
- IDEA安装后找不到.vmoptions文件在安装IDEA后在C盘的C:\Users\你的电脑用户名.IntelliJIdea2019.1\
- 介绍跨域CORS,全称是"跨域资源共享"(Cross-origin resource sharing)当页面发出跨域请求
- 在基于Mybatis-plus实现多租户架构中,介绍了在多租户项目中如果要开启一个子线程,那么需要手动进行RequestAttributes
- 顺序语句顺序顾名思义就是程序自上而下执行public class User { public static voi
- 项目介绍springboot搭建的访客管理系统,针对高端基地做严格把控来访人员信息管理,用户后端可以设置多个管理员帐号,给予不同部门的管理层
- 这篇文章主要介绍了spring如何实现两个xml配置文件间的互调,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 一 为什么要使用线程池对于操作系统而言,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换时要执行内存换页,清空
- 遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。它能解决很多问题,
- 一、遇到一个问题1、读取CSV文件package com.guor.demo.charset;import java.io.Buffered
- 先说一下对异步和同步的理解:同步调用:调用方在调用过程中,持续等待返回结果。异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任
- 泛型中 T 类型变量 和 ? 通配符 区别定义不同 :T 是类型变量,? 是通配符使用范围不同:? 通配符用作 参数类型、字段类型、局部变量
- 一、reservedcodecachesize参数介绍该参数是JvM虚拟机调优中调整内存大小的一个设置参数,值得大小设置直接影响到Code
- 前言Spring框架对Bean进行装配提供了很灵活的方式,下面归纳一下主要的方式:在XML中进行显示配置在Java中进行显示配置隐式的bea
- 1 前言许多语言,例如 Perl ,Python 和 Ruby ,都有集合的本地支持。有些语言(例如Python)甚至将基本集合组件(列表,
- Struts2Struts2是在WebWork2基础发展而来的。和struts1一样, Struts2也属于MVC框架。不过有一点
- 简介本文用示例介绍java的Period的用法。Duration和Period说明Duration类通过秒和纳秒相结合来描述一个时间量,最高
- 本文实例讲述了Java实现二分查找算法。分享给大家供大家参考。具体如下:1. 前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的
- 由于我们在eclipse ee中把项目部署在web端经常会出现报404错误。原因为:404状态码是一种http状态码,其意思是: 所请求的页
- 前言各位小伙伴大家好,我是A哥。IDEA上个较大版本的发布,要追溯到4月份了:时隔近4个月,北京时间2020-07-28深夜,Intelli