1.前端页面ftl

<#import "/WEB-INF/freemarker_include/base.ftl" as base/>
<!DOCTYPE html>

<#assign basePath=request.contextPath>
<html lang="zh-cn">
<head><@base.head/>
</head>

<body class="background-white" style="overflow: hidden;">
<div id="container" class="ph-container"
style="padding: 5px; overflow-y: auto;">
<div class="ph-content layout-fill" style="padding: 5px;">
<form id="edit_form" class="form-horizontal ph-form"
action="commonUser!updateChangePassword.action" method="post">
<table style="width: 100%; font-size: 12px; min-width: 400px;"
class="table table-hover ph-info-table">
<thead>
<tr>
<th colspan="3" class="ph-info-title"><i
class="fa fa-angle-up"></i>修改密码</th>
</tr>
</thead>
<tbody>
<tr>
<td width="150" class="ph-info-label"><span
class="ph-txt-impt">*</span>账号:</td>
<td width="220" class="ph-info-value"><input type="Text"
placeholder="" name="paramMap.userName" id="user_name"
class="form-text required" value=""></td>
<td class="ph-info-value">&nbsp;</td>
</tr>
<tr>
<td width="150" class="ph-info-label"><span
class="ph-txt-impt">*</span>手机号:</td>
<td width="220" class="ph-info-value"><input type="text"
placeholder="请输入手机号" name="mobile" maxlength="11" id="mobile"
class="form-text required" value=""></td>
<td style="padding-left: 20px;"><input
class="ph-btn-default" type="button" name="paramMap.verCodeBtn"
id="paramMap_verCodeBtn" value="获取验证码" οnclick="setTime(this)" /><span
id="show_time"></span></td>
</tr>
<tr>
<td width="150" class="ph-info-label"><span
class="ph-txt-impt">*</span>验证码:</td>
<td width="220" class="ph-info-value"><input type="Text"
placeholder="请输入验证码" name="paramMap.verCode" maxlength="6"
id="paramMap_verCode" class="form-text required" value=""></td>
<td class="ph-info-value">&nbsp;</td>
</tr>
<tr>
<td class="ph-info-label"><span class="ph-txt-impt">*</span>新密码:
</td>
<td class="ph-info-value"><input type="password"
placeholder="" name="paramMap.userPassword" id="user_password"
class="form-text required" value=""></td>
<td class="ph-info-value" style="padding-left: 30px;">密码长度不低于八位,大写字母、小写字母、数字、字符包含三点以上,不能包含用户名。区分大小写</td>
</tr>
<tr>
<td class="ph-info-label"><span class="ph-txt-impt">*</span>再次输入新密码:
</td>
<td class="ph-info-value"><input type="password"
placeholder="" name="passwordConfirm" id="password_confirm"
class="form-text required" value=""></td>
<td class="ph-info-value" style="padding-left: 30px;">请再次填写密码</td>
</tr>
<tr>
<td class="ph-info-label">&nbsp;</td>
<td class="ph-info-value">
<button type="submit" class="ph-btn-default"
style="padding-left: 30px; padding-right: 30px;">保存</button>
</td>
<td class="ph-info-value" style="padding-left: 30px;">&nbsp;</td>
</tr>
</tbody>
</table>
</form>
</div>
</div>

<@base.baseJavascript/>
<script src="../js/phssh/sys/user_updatechangePassword.js"
type="text/javascript"></script>
<script src="../js/phssh/sys/md5.js" type="text/javascript"></script>
<script src="../js/phssh/sys/jquery.base64.js" type="text/javascript"></script>

<script type="text/javascript">
//验证码
var counts = 120;
var sendTag = '0';
var setTimeoutTag = undefined;

function setTime(val) {
  var mobile = $('#mobile').val();
  var userName = $('#user_name').val();
if(null == userName || '' == userName){
  alert('请输入要修改密码的工号...');
  return false;
}
if (('' == mobile || undefined == mobile) || mobile.length != 11) {
  alert('请输入正确的手机号码...');
  return false;
}
if ('0' == sendTag) {
  // 获取短信验证码
  getCodeStr(mobile,userName);
}
if (counts == 0) {
  val.removeAttribute("disabled");
  val.value = "获取验证码";
  counts = 120;
  sendTag = tag;
  clearTimeout(setTimeoutTag);
} else {
  sendTag = '1';
  val.setAttribute("disabled", 'disabled');
  val.value = "重新发送(" + counts + ")";
  counts--;
}
setTimeoutTag = setTimeout(function() {
  setTime(val);
  }, 1000);
}

// 到后台获取短信验证码
function getCodeStr(mobile,userName) {
  $.ajax({
  type : 'post',
  dataType : 'json',
  url : "sendVer.action",
  data : {
  'paramMap.mobile' : mobile,
  'paramMap.userName' : userName
},
success : function(data) {
  if('200' == data.statusCode){
  alert("验证码发送成功...");
  }else{
  alert("验证码发送失败" + data.message + "...");
  }
},
error : function() {
  alert("发送失败...");
  }
 });
}

$('#edit_form').submit(function() {
  if ($('#paramMap_verCode').val() == '') {
    alert('请输入验证码');
    return false;
  }
  if ($('#user_password').val() == '') {
    alert('请输入新密码');
    return false;
  }
  if ($('#user_password').val() != $('#password_confirm').val()) {
    alert('两次输入的密码不一致,请重新输入');
    return false;
  }
  $.ajax({
    type : 'post',
    dataType : 'json',
    url : 'chackVerifi.action',
    data : {
      'paramMap.verCode' : $("#paramMap_verCode").val(),
      'paramMap.userName' : $("#user_name").val(),
      'paramMap.mobile' : $("#mobile").val(),
      'paramMap.userPassword' : $("#user_password").val()
    },
    success : function(data) {
      if ('200' == data.statusCode) {
        alert("密码修改成功!!!");
        window.location.href = "loginP.action";
      } else {
        alert("操作失败..." + data.message);
      }
    }
  });
  return false;
});
</script>
</body>

</html>

2.PO

@Getter
@Setter
@Entity
@Table(name = "SYS_SEND_VER")
public class SendVer {

/** ID */
@Id
@GenericGenerator(name = "objectIdGenerator", strategy = "com.powerhua.phssh.po.id.ObjectIdGenerator")
@GeneratedValue(generator = "objectIdGenerator")
@Column(name = "ID", unique = true, nullable = false, length = 24)
private String id;

// 用户工号
@Column(name = "user_name")
private String userName;

// 手机号码
@Column(name = "mobile")
private String mobile;

// 验证码
@Column(name = "code_Str")
private String codeStr;

// 发送时间
@Column(name = "send_Time", updatable = false)
protected Timestamp sendTime = new Timestamp(System.currentTimeMillis());

}

3.发送短信校验码,校验数据库校验码

// 发送短信验证码
public String sendVer() {
  log.info("发送短信验证码进来了..." + "手机号码:" + paramMap.get("mobile") + " 工号:" + paramMap.get("userName"));
  String statusCode = JsonResult.STATUS_CODE_FAIL;
  String msg = "";
  try {
    // 生产随机数验证码
    int verificationCode = (int) ((Math.random() * 9 + 1) * 100000);
    log.info("验证码是:" + verificationCode);
    String mobile = paramMap.get("mobile");
    String userName = paramMap.get("userName");
  if (StringUtils.isEmpty(mobile)) {
    throw new Exception("手机号码为空,验证失败.");
  }
  if (StringUtils.isEmpty(userName)) {
    throw new Exception("用户工号为空,验证失败.");
  }
  List<User> userList = baseService.queryByHql("from User u where u.isValid='1' and u.userName=?",userName);
  if (null == userList || userList.isEmpty()) {
    throw new Exception("用户工号不存在,验证失败.");
  }
  // 发送短信验证码
  String resXml = SmsUtils.sendVer(mobile, verificationCode + "");
  if(StringUtils.isEmpty(resXml)){
    throw new Exception("发送验证码失败.");
  }
  log.info("发送短信验证码返回结果:" + resXml);
  if (StringUtils.isNotEmpty(resXml)) {
    Document document = DocumentHelper.parseText(resXml);
    Element root = document.getRootElement();
    String status = root.selectSingleNode("//status").getText();
    log.info(status);
    // 记录发送短信验证码日志
    SendVer addSendVer = new SendVer();
    addSendVer.setCodeStr(verificationCode + "");
    addSendVer.setMobile(mobile);
    addSendVer.setUserName(userName);
    addSendVer.setSendTime(new Timestamp(System.currentTimeMillis()));
    baseService.save(addSendVer);
    statusCode = JsonResult.STATUS_CODE_SUCCESS;
  }
} catch (Exception e) {
  e.printStackTrace();
  msg = e.getMessage();
}
  jsonResult = new JsonResult(statusCode, msg);
  return SUCCESS;
}

//校验验证码
public String chackVerifi() {
  String statusCode = JsonResult.STATUS_CODE_FAIL;
  String msg = "";
  try {
    log.info("修改密码验证码入参:" + paramMap);
  // 获取数据
  String verCode = paramMap.get("verCode");
  String userName = paramMap.get("userName");
  String mobile = paramMap.get("mobile");
  String userPassword = paramMap.get("userPassword");
  // 校验用户是否存在
  List<User> userList = baseService.queryByHql("from User u where u.isValid='1' and u.userName=?",userName);
  if (null == userList || userList.isEmpty()) {
    throw new Exception("用户工号不存在,修改密码失败.");
  }

  // 判断验证码是否正确
  String hql = " from SendVer s where s.userName = ? and s.mobile=? and s.codeStr = ? order by sendTime desc ";
  List<SendVer> list = baseService.queryByHql(hql, userName, mobile,
  verCode);
  if (null == list || list.isEmpty()) {
    throw new Exception("验证码不存在,修改密码失败...");
  }
  // 判断是否过期、时间必须是两分钟内
  SendVer existsVer = list.get(0);
  Timestamp currentTime = new Timestamp(System.currentTimeMillis());
  long timeCount = currentTime.getTime() - existsVer.getSendTime().getTime();
  // 时间超过120秒
  if ((timeCount / 1000) > 120) {
    throw new Exception("验证码已超时,请重试...");
  }
  // 验证通过 修改密码
  User updateUser = userList.get(0);
  if(null != updateUser){
    updateUser.setUserPassword(DigestUtils.md5Hex(userPassword));
    baseService.update(updateUser);
    log.info("修改密码成功....");
    statusCode = JsonResult.STATUS_CODE_SUCCESS;
    }
  } catch (Exception e) {
    msg = e.getMessage();
    e.printStackTrace();
  }
  jsonResult = new JsonResult(statusCode, msg);
  return SUCCESS;
}

4.发送短信验证码接口

//发送验证码
public static String sendVer(String mobile,String verificationCode){
  String resXml = "";
  try {
    String contents1 = "您登录*****系统的验证码为"+verificationCode+
    "该验证码仅限使用一次且在2分钟内有效。"+
    "--****,更快、更稳、更智能!";
    String appMessageID = ((long)(Math.random()*1000000000))+"" ;

    //发送验证码接口url
    String url = "http://?.?.?.?:8080/axis2/services/SmsService?****";
    InputStream is = SmsUtils.class.getResourceAsStream("/com/***/webservice/client/sms/sms_req.xml");
    String xmlStr = HttpConnectionCall.getByteByStream(is, "UTF-8");
    xmlStr = xmlStr.replace("#AuthenticatorClient", getAuthent())
    .replace("#TimeStamp", timeStamp)
    .replace("#appMessageID", appMessageID)
    .replace("#destTermID", mobile)
    .replace("#msgContent", contents1);
    resXml = HttpConnectionCall.execute(url, xmlStr);
  } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
    return resXml;

}

5.sms_req.xml配置文件

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:axis="http://ws.apache.org/axis2">
<soapenv:Header />
<soapenv:Body>
<axis:sendMessage>
<ClientID>wzh</ClientID>
<AuthenticatorClient>#AuthenticatorClient</AuthenticatorClient>
<TimeStamp>#TimeStamp</TimeStamp>
<Message>
<appMessageID>#appMessageID</appMessageID>
<destTermID>#destTermID</destTermID>
<msgContent>#msgContent</msgContent>
<msgLevel>0</msgLevel>
<sendMan></sendMan>
<spCode>10001</spCode>
</Message>
</axis:sendMessage>
</soapenv:Body>
</soapenv:Envelope>

------------------------------------------------------

md5加密:DigestUtils.md5Hex("********");

Gson gson = new GsonBuilder().disableHtmlEscaping().create();
paraStr = gson.toJson(obj).toString();

转载于:https://www.cnblogs.com/94-181227/p/10899939.html

通过短信验证码修改密码相关推荐

  1. html5实现短信验证修改密码,thinkphp5如何调用云片接口实现发送短信验证码找回密码功能...

    下面由thinkphp框架教程栏目给大家介绍thinkphp5如何调用云片接口实现发送短信验证码找回密码功能,希望对需要的朋友有所帮助! 思路: 1.用户输入手机号,请求获取短信验证码. 2.thin ...

  2. php实现短信找回密码,thinkphp5怎么调用云片接口实现发送短信验证码找回密码功能...

    thinkphp5怎么调用云片接口实现发送短信验证码找回密码功能 发布时间:2020-12-11 12:33:42 来源:亿速云 阅读:60 作者:小新 小编给大家分享一下thinkphp5怎么调用云 ...

  3. 京东金融回应用户遭盗刷:系用户点击假冒链接 输短信验证码致密码泄露

    10月21日消息,针对用户银行卡被盗刷一事,京东金融方面回应称,经核查,此用户是本人点击了假冒抽奖链接,并且在操作时受该链接引导,多次输入短信验证码,导致自身在京东平台的支付密码.短信支付验证码均泄露 ...

  4. 使用阿里云短信验证码API发送短信验证码(配置,获取短信验证码,注册,登录,密码重置)

    获取阿里云短信验证码需要的配置信息. 如果是新用户,可以免费领取3个月,老用户的话就只能购买了,但是也不贵. 申请短信签名 申请短信模板 编写发送短信验证码的工具类 代码中我已经进行了详细的注释,也写 ...

  5. 一文带你看透短信验证码

    短信验证码应用于我们生活.工作的方方面面,比如注册登录账号.支付订单.修改密码等等.验证码短信主要出于安全的考虑,防止应用/网站被恶意注册,恶意攻击,对于网站.APP而言,大量的无效注册,重复注册,甚 ...

  6. robotframework(12)修改用户密码(从数据库查询短信验证码)

    一.testcase:修改用户密码需要6个参数(短信验证码.设置的新密码.用户已登录的userid及用户唯一标识.接口校验码.被修改的手机号),故先准备这些参数 二.用户登录请求,(获取userid. ...

  7. Spring Boot + Spring-Security实现前后端分离双重身份认证初学者指南(手机号密码JWT + 短信验证码)

    折(mo)腾(yu)了好几天,终于把双重身份认证实现了.(账号密码jwt+短信验证码) 看了很多视频,照葫芦画瓢敲了两三次,遇到各种各样的bug,比如循环依赖(通过@PostConstructor+s ...

  8. Android基于Bmob后端云实现注册、登陆、找回密码、短信验证码

    注重版权,转载请注明原作者和原文链接 作者:Bald programmer 文章目录 整体功能展示 创建应用 配置Bmob 前期准备 一.数据表 二.工具类 代码设计 一.注册模块 二.登陆模块 三. ...

  9. 2.vue3医疗在线问诊项目 - _登录模块 ==> 代码片段、css变量主题定制、cp-nav-bar组件封装、svg打包精灵图插件、cp-icon组件封装、表单校验、密码登录、短信验证码登录及两者

    2.医疗在线问诊项目 - _登录模块 ==> 代码片段.css变量主题定制.cp-nav-bar组件封装.svg打包精灵图插件.cp-icon组件封装.表单校验.密码登录.短信验证码登录及两者的 ...

最新文章

  1. 不明原因的约束报错的两种处理方式
  2. qq截图工具提取_QQ截图隐藏的这些简单又实用的技能,怪我没早告诉你
  3. 关于node.js和npm 和nvm_byKL
  4. phpSysInfo监测服务器
  5. 黑客利用域前置技术攻击缅甸政府并隐藏恶意活动
  6. 从省市级到区县级,Power BI topoJSON 中国行政区划地图都在这了
  7. Matlab曲线平滑
  8. 计算机教室建设方案ppt,屏蔽机房建设方案.ppt
  9. fluent瞬态计算终止条件在哪里设置_五.从卡门涡街看FLUENT设置依据
  10. Kettle工具——Spoon、Kitchen、Pan、Carte
  11. 第六章 (数据库) 第3节 数据库高级
  12. 固态装linux,Linux下安装SSD固态卡
  13. Docker安装教程(超详细)
  14. IDEA这么优化后,代码跑得嗖嗖的...
  15. 算法设计与分析第一章递推算法
  16. 等离子电视工作原理(转)
  17. PHP 获取微视无水印源地址_最新PHP解析抖音获取无水印视频代码
  18. jquery通过id显示隐藏
  19. module-info.java是什么_刚接触jdk 11的模块系统,那么怎么处理module-info.java呢?
  20. Unity UGUI优化与原理【unity官方】

热门文章

  1. 严恭敏PSINS工具箱航位推算DR解读
  2. Mat::ones() 和 Mat::zeros()
  3. ADAudit Plus的UEBA功能如何解决企业面临的安全挑战
  4. 把漫画浏览器的离线下载的功能给实现了一下
  5. DP和HDMI有什么区别?DP1.4和DP1.2线材怎么选?显示器视频带宽如何计算?
  6. 2023年(第一批)上海市服务业发展引导资金杨浦区拟转报项目名单公示
  7. 机器学习入门级实例——针对葡萄酒质量进行建模
  8. 被讨厌的勇气:第二章读书笔记
  9. 蓝牙(三)a2dp连接
  10. 《即刻电音》:大张伟遭遇“团灭”危机情绪失控