Java發(fā)送郵箱驗證碼、session校驗功能
本篇主要描述“發(fā)送郵箱驗證碼、session校驗”相關前(html\js)后(java)臺代碼,業(yè)務邏輯示例,閑話少訴,直接上代碼。
1、引入的jar包是mail-1.4.jar
2、java底層發(fā)送郵箱方法
public boolean sendEMail(Map<String, Object> map) {
log.info("電子郵件接口執(zhí)行開始!");
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+")、內(nèi)容("+content+")有為空項,不符合發(fā)送條件");
return false;
}
try{
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp"); // 使用的協(xié)議(JavaMail規(guī)范要求)
props.setProperty("mail.smtp.host", smtpHost); // 發(fā)件人的郵箱的 SMTP服務器地址
props.setProperty("mail.smtp.auth", "true"); // 請求認證,參數(shù)名稱與具體實現(xiàn)有關
// 創(chuàng)建Session實例對象
Session session = Session.getDefaultInstance(props);
// 創(chuàng)建MimeMessage實例對象
MimeMessage message = new MimeMessage(session);
// 設置發(fā)件人
message.setFrom(new InternetAddress(from));
// 設置收件人
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
// 設置發(fā)送日期
message.setSentDate(new Date());
// 設置郵件主題
message.setSubject(subject);
// 設置純文本內(nèi)容的郵件正文
message.setText(content);
// 保存并生成最終的郵件內(nèi)容
message.saveChanges();
// 設置為debug模式, 可以查看詳細的發(fā)送 log
session.setDebug(true);
// 獲取Transport對象
Transport transport = session.getTransport("smtp");
// 第2個參數(shù)需要填寫的是QQ郵箱的SMTP的授權碼,什么是授權碼,它又是如何設置?
transport.connect(from, pwd);
// 發(fā)送,message.getAllRecipients() 獲取到的是在創(chuàng)建郵件對象時添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}catch(Exception e){
log.error(e.getMessage(), e);
return false;
}
log.info("電子郵件接口執(zhí)行完成,執(zhí)行成功!");
return true;
}
3、java業(yè)務邏輯層調(diào)用發(fā)送郵箱、驗證碼加密存儲在session中
@RequestMapping("/sendEMail.do")
public void sendEMail(HttpServletRequest request, HttpServletResponse response) {
String json = "{\"success\":false,\"message\":\"操作失敗\",\"returnVal\":\"\"}";
boolean res = false;//發(fā)送郵件標記
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();
//發(fā)送驗證碼
String _debug = Cache.getInstance().getParams(Constant.UIAS_DEBUG);
if("1".equals(_debug)){//調(diào)試模式 不真發(fā)送 直接回顯
map.put("checkcode", checkcode);
res = true;
}else{//非調(diào)試模式 真實發(fā)送郵件
//驗證是否頻繁發(fā)送驗證碼請求 單位 秒
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){
//組裝數(shù)據(jù)
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);
//調(diào)用發(fā)送
res = ieMailService.sendEMail(map);
}else{
json = "{\"success\":false,\"message\":\"請耐心等待,不要頻繁發(fā)送驗證碼申請\",\"returnVal\":\"\"}";
return;
}
}
//發(fā)送成功后續(xù)操作
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\":\"郵箱驗證碼發(fā)送成功,已經(jīng)待填到驗證碼框!\",\"returnVal\":\"\",\"checkcode\":\""+checkcode+"\"}";
}else{
json = "{\"success\":true,\"message\":\"郵箱驗證碼發(fā)送成功,請查收郵件!\",\"returnVal\":\"\"}";
}
}
} catch (Exception e) {
logger.error("發(fā)送郵件驗證碼異常", 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{
//在有效期內(nèi) 比對驗證碼準確性
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組的內(nèi)容
mail = mail.replaceAll("(\\w?)(\\w+)(\\w)(@\\w+\\.[a-z]+(\\.[a-z]+)?)", "$1****$3$4");
// 括號表示組,被替換的部分$n表示第n組的內(nèi)容
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 函數(shù)調(diào)用 按鈕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發(fā)送郵箱驗證碼、session校驗功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
springboot-jta-atomikos多數(shù)據(jù)源事務管理實現(xiàn)
本文主要介紹了springboot-jta-atomikos多數(shù)據(jù)源事務管理實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
Mybatis不支持batchInsertOrUpdate返顯id問題
這篇文章主要介紹了Mybatis不支持batchInsertOrUpdate返顯id問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
ConcurrentModificationException日志關鍵字報警思考分析
本文將記錄和分析日志中的ConcurrentModificationException關鍵字報警,還有一些我的思考,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-12-12

