reg.ftl

<div class="formRow"><input type="text" id="random" name="random" placeholder="短信验证码"><button type="button" id="getCode" class="btn_code">获取验证码</button>
</div>

JS

/* ---------------- 验证用户名为手机号 ---------------- */
<span style="white-space:pre">         </span>function validation(tel){
<span style="white-space:pre">         </span>  reg=/^1[3|4|5|7|8]\d{9}$/;
<span style="white-space:pre"> </span>  return reg.test(tel);
<span style="white-space:pre">         </span>}
/* ---------------- jquery init ---------------- */$(function(){//点击获取验证码$('.btn_code').on('click',function(){$.ajax({type:"post",url:"${path}/reg/chickout",data:$("#validation-form").serialize(),success:function(data){// 验证电话号码var tel = $('#username').val();if(tel=="" || !validation(tel)){common.alert({content:'请输入正确的手机号码'});return false;}if(data.code==500){common.alert({content:data.msg});return false;}else{<span style="color:#ff6666;">//获取验证码getCode(tel);</span>//启动计时器timeOut();}<span style="white-space:pre">   </span>}<span style="white-space:pre">   </span>})});
/* ---------------- 获取验证码 ---------------- */
<span style="white-space:pre">         </span>function getCode(tel){
<span style="white-space:pre">             </span>$.ajax({
<span style="white-space:pre">                 </span>type:"post",
<span style="white-space:pre">                 </span>dataType:"json",
<span style="white-space:pre">                 </span>data:{
<span style="white-space:pre">                     </span>"username":tel
<span style="white-space:pre">                 </span>},
<span style="white-space:pre">                 </span><span style="color:#ff6666;">url:"${path}/message/reg",</span>
<span style="white-space:pre">                 </span>success:function(data){
<span style="white-space:pre">                     </span>if('200' == data.code){
<span style="white-space:pre">                         </span>common.alert({content:'验证码已发送,请注意查收'});
<span style="white-space:pre">                     </span>}else if('300' == data.code){
<span style="white-space:pre">                         </span>$('#random').val(data.result);
<span style="white-space:pre">                         </span>//common.alert({content:'短信接口被停用'});
<span style="white-space:pre">                     </span>}else{
<span style="white-space:pre">                         </span>common.alert({content:data.msg});
<span style="white-space:pre">                     </span>}
<span style="white-space:pre">                 </span>},error: function(XMLHttpRequest, textStatus, errorThrown) {
<span style="white-space:pre">                     </span>common.alert({content:'网络异常'});
<span style="white-space:pre">     </span>}
<span style="white-space:pre">             </span>})
<span style="white-space:pre">         </span>}

RegController

/** * 电脑端注册* @author CHAN*/
@Controller
@RequestMapping(value="/reg")
public class RegController extends BaseController {Logger logger = Logger.getLogger(RegController.class);@Autowiredprivate IMemberService memberService;@Autowiredprivate IMemberLocationRecordService recordService;  @Autowiredprivate RedisService redisService;/*** 注册页面*/@RequestMapping(method = RequestMethod.GET)public String reg(){return "reg";}/*** 注册*/@RequestMapping(method=RequestMethod.POST)@ResponseBodypublic ResultObject doReg(Member member,String random,RedirectAttributes redirectAttributes,HttpServletRequest request){try {/** -------- redis获取验证码 -------- **/String randomInRedis = redisService.get("redis_login_"+member.getUsername());if(!randomInRedis.equals(random)){return new ResultObject("500", "短信验证码错误", null);}/** -------- 会员注册-------- **/ResultObject rs = memberService.register(member);/** -------- 会员登陆-------- **/SSOToken st = new SSOToken(request);st.setId(member.getId());st.setType(1);st.setData(member.getUsername());//记住密码,设置 cookie 时长 1 周 = 604800 秒 【动态设置 maxAge 实现记住密码功能】if ( "on".equals(request.getParameter("rememberMe")) ) {request.setAttribute(SSOConfig.SSO_COOKIE_MAXAGE, 604800); }SSOHelper.setSSOCookie(request, response, st, true);//记录地理位置recordService.saveMemberLocationRecord(member,new Corporation(corpid),request);return rs;} catch (Exception e) {logger.error("注册出错", e);return new ResultObject("500", "注册出错", null);}}@RequestMapping(value="/chickout",method=RequestMethod.POST)@ResponseBodypublic ResultObject chickout(Member member,String random,RedirectAttributes redirectAttributes,HttpServletRequest request,HttpSession session){try {/** -------- 检查用户名-------- **/Member temp = memberService.findMemberByUsername(member.getUsername());if(temp!=null){return new ResultObject("500", "该手机号码已被注册", null);}//判断验证码String code = (String) session.getAttribute("captcha");String summitCode = request.getParameter("captcha");if(StringUtils.isBlank(summitCode) || !StringUtils.equals(code.toLowerCase(), summitCode.toLowerCase())){return new ResultObject("500", "验证码错误", "");}return new ResultObject("200", "手机号和图像验证码确认无误", null);    } catch (Exception e) {logger.error("注册出错", e);return new ResultObject("500", "注册出错", null);}}/*** 判断账号是否唯一 * true表示唯一*/@RequestMapping(value="/unique/username",method = RequestMethod.POST)@ResponseBodypublic boolean unique(String username){try{return memberService.unique(username);}catch(Exception e){logger.error("判断账号是否唯一,username="+username, e);return false;}}}

MessageController

/** * 短消息控制器* * @author CHAN*  */
@Controller
@RequestMapping(value="/message")public class MessageController extends BaseController {Logger logger = LoggerFactory.getLogger(MessageController.class);@Autowiredprivate IMessageChannelService messageChannelService;@Autowiredprivate RedisService redisService;<span style="color:#ff6666;">/*** v1.0 注册验证码 2015-12-24 CHAN*/@RequestMapping(value="/reg",method=RequestMethod.POST)@ResponseBodypublic ResultObject sendMessage(@RequestParam String username){try {/** -------- 验证码生成 -------- **/String random = RandomStringUtils.random(6, "0123456789");/** -------- 将手机号,验证码存储到redis -------- **/redisService.set("redis_login_"+username, random, 1200);//60s 20min/** -------- 发送消息 -------- **/Map<String, String> map = new HashMap<String, String>();map.put("code", random);ResultObject rs = messageChannelService.send(corpid, MessageTemplateEnum.VERIFYCODE.getValue(), username, map);return rs;} catch (Exception e) {logger.error("发送登陆验证码失败", e);return new ResultObject("500", "发送登陆验证码失败", null);}}</span>/*** v1.0 修改密码验证码 2015-12-24 CHAN*/@RequestMapping(value="/forgetPassword",method=RequestMethod.POST)@ResponseBodypublic ResultObject sendMessageP(@RequestParam String username){try {/** -------- 验证码生成 -------- **/String random = RandomStringUtils.random(6, "0123456789");/** -------- 将手机号,验证码存储到redis -------- **/redisService.set("redis_login_"+username, random, 300);//60s 5min/** -------- 发送消息 -------- **/Map<String, String> map = new HashMap<String, String>();map.put("code", random);ResultObject rs = messageChannelService.send(corpid, MessageTemplateEnum.VERIFYCODE.getValue(), username, map);return rs;} catch (Exception e) {logger.error("发送修改密码验证码失败", e);return new ResultObject("500", "发送修改密码验证码失败", null);}}
}

IMessageChannelService

@SuppressWarnings(value="all")
public interface IMessageChannelService extends IBaseService<MessageChannel>{<span style="color:#cc33cc;">/** 查询当前企业的短信通道 */public MessageChannel findMessageChannelByCorpId(Long corpid) throws Exception;</span><span style="color:#6633ff;">/** 短信接口请求 */public ResultObject request(Long corpid,Integer templateTypeId,String action,String mobile,Map map) throws Exception;</span><span style="color:#ff6666;">/** 短信接口发送 */public ResultObject send(Long corpid,Integer templateTypeId,String mobile,Map map) throws Exception;</span>
}

MessageChannelServiceImpl

@SuppressWarnings(value="all")
@Component
public class MessageChannelServiceImpl extends BaseServiceImpl<MessageChannel> implements IMessageChannelService {Logger logger = Logger.getLogger(MessageChannelServiceImpl.class);@Autowiredprivate MessageChannelDao messageChannelDao;@Autowiredprivate MessageRecordDao messageRecordDao;@Autowiredprivate MessageTemplateDao messageTemplateDao;@Autowiredprivate IMessageRecordService messageRecordService;<span style="color:#cc33cc;">/** 查询当前企业的短信通道 */@Overridepublic MessageChannel findMessageChannelByCorpId(Long corpid) throws Exception {return messageChannelDao.findByCorpId(corpid);}</span><span style="color:#3366ff;">/*** 功能:短信请求* create by chan on 2016-08-16* @param corpid                 企业id* @param templateTypeId    短信模板类型* @param action                  动作* @param mobile              手机号码* @param map                   短信模板参数* @return*/@Overridepublic ResultObject request(Long corpid, Integer templateTypeId, String action, String mobile, Map map) throws Exception {</span><span style="color:#cc33cc;">/** -------- 判断短信通道情况  --------*/MessageChannel channel = findMessageChannelByCorpId(corpid); if(channel.getStatus()==StatusEnum.STOP.getValue()){return new ResultObject("300", "短信接口已停用",map.get("code"));}boolean isMinimumInterval = messageRecordService.isMinimumInterval(corpid, mobile);if(isMinimumInterval){return new ResultObject("301", "您发送短信过于频繁,请稍后点击发送",null);}boolean isReachWaringLine = messageRecordService.isReachWaringLine(corpid);if(isReachWaringLine){return new ResultObject("302", "超出日均最大短信数量",null);}</span><span style="color:#3366ff;">/** -------- 组织参数  --------*/String url = channel.getUrl();String userid = channel.getUserid();String account = channel.getAccount();String password = channel.getPassword();String extno = channel.getExtno();</span><span style="color:#999900;">//根据短信类型,查询出短信模板String templateContent = messageTemplateDao.findByCorpIdAndType(corpid,templateTypeId).getContent();StringBuffer cnt = new StringBuffer();//根据短信模板,生成对应的短信记录cnt.append("【").append(channel.getSign()).append("】").append(replaceTemplate(templateContent, map));
</span><span style="color:#3366ff;">/** -------- 使用Httpclient发送请求参数 --------*/HttpClient client = new HttpClient();PostMethod post = new PostMethod(url);try { /*-------- 设置请求接口和参数 -------- */post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");// 在头文件中设置转码NameValuePair[] data = {new NameValuePair("action", action),new NameValuePair("userid", userid),new NameValuePair("account", account),new NameValuePair("password", password),new NameValuePair("mobile", mobile),new NameValuePair("content", cnt.toString()),new NameValuePair("extno", extno) };post.setRequestBody(data);/* -------- 发送请求 -------- **/client.executeMethod(post);/* -------- 返回状态 -------- **/// 返回状态int statusCode = post.getStatusCode();System.out.println("statusCode:" + statusCode);// 返回头信息
//              Header[] headers = post.getResponseHeaders();
//              for (Header h : headers) {
//                  System.out.println(h.toString());
//              }/** -------- 处理结果--------*/// 返回信息 {"smsid":"9EF0A9EC94139CDC57F812D0CFB314DA","code":"0"} 表示成功//xml string->mapString result = new String(post.getResponseBody(),"UTF-8");System.out.println(result);Map<String,String> xmlobj = parseXml(result);String returnstatus = xmlobj.get("returnstatus");String message = xmlobj.get("message");String remainpoint = xmlobj.get("remainpoint");if (!returnstatus.equals("Success")){return new ResultObject("500", "短信http通讯错误", null);}if(!message.equals("ok")){return new ResultObject("500", "短信接口错误 :"+message, null);}//新增短信记录MessageRecord record = new MessageRecord(mobile, cnt.toString());record.setCorp(channel.getCorp());record.setCreateTime(new Date());record.setReturnstatus(returnstatus);record.setMessage(message);messageRecordDao.save(record);//修改短信通道剩余条数channel.setRemainpoint(Integer.parseInt(remainpoint));messageChannelDao.save(channel);return new ResultObject("200", "短信发送成功,注意查收", null);} catch (Exception e) {logger.error("短信接口错误", e);return new ResultObject("500", "短信接口错误", null);} finally {// 释放链接post.releaseConnection();}}</span><span style="color:#ff6666;">/** 短信接口发送 */@Overridepublic ResultObject send(Long corpid,Integer templateTypeId,String mobile,Map map) throws Exception{return request(corpid, templateTypeId, "send", mobile, map);}</span>    public static Map<String,String> parseXml(String text) throws Exception{Map<String,String> map = new HashMap<String, String>();Document document = DocumentHelper.parseText(text);//得到xml根元素Element root = document.getRootElement();List<Element> elements = root.elements();for (Element element : elements) {map.put(element.getName(), element.getText());}return map;}public static String generateString(String str,List<Object> list){StringBuilder sb  = new StringBuilder();int i=0;for(String temp : str.split("_")){sb.append(temp);if(i<list.size())sb.append(list.get(i));i++;}return sb.toString();}public static String replaceTemplate(String template,Map<String,String> map){for (String key:map.keySet()) {System.out.println("#"+key+"#");template = template.replace("#"+key+"#", map.get(key));}return template;}public static Double formatString(String str){Double db = Double.valueOf(str);db=((int)(db*100))/100.0;return db;}public static void main(String[] args) {Map<String,String> map = new HashMap<String, String>();map.put("code1", "aaa");map.put("code2", "bbb");String template= "#code1#,wcnm,#code2#";template = replaceTemplate(template, map);System.out.println(template);}// public static void main(String[] args) {
//      //String result = "{\"smsid\":\"9EF0A9EC94139CDC57F812D0CFB314DA\",\"code\":\"0\"}";
//      String result = "{\"code\":\"-1000\"}";
//      JSONObject jsonobj = JSON.parseObject(result);
//      int code = jsonobj.getInteger("code");
//      String smsid = jsonobj.getString("smsid");
//      System.out.println(code);
//      System.out.println(smsid==null);
//
//      String str = "尊敬的客户,您的账户_于_年_月_日成功充值,人民币_元。 回T退订.";String str1 = "您的手机验证码为:_,请在5分钟内完有效。如非本人操作请忽略本短信。回T退订.";
//      List<Object> list = new ArrayList<Object>();
//      list.add("account");
//      list.add("year");
//      list.add("month");
//      list.add("day");
//      list.add(874198);
//      System.out.println(generateString(str, list));
//  }
}

IMessageRecordService

public interface IMessageRecordService extends IBaseService<MessageRecord> {//计算当前时间和最新一条短信记录的时间差,单位是秒public int calculateInterval(Long corpid, String mobile) throws Exception;<span style="color:#cc33cc;">//判断是否,在发送最小间隔内public boolean isMinimumInterval(Long corpid, String mobile) throws Exception;//判断是否,达到预警线public boolean isReachWaringLine(Long corpid) throws Exception;</span>}

MessageRecordServiceImpl

@Component
public class MessageRecordServiceImpl extends BaseServiceImpl<MessageRecord> implements IMessageRecordService {@Autowiredprivate MessageRecordDao recordDao;@Autowiredprivate MessageChannelDao messageChannelDao;/** ------------------------------- 扩展  ------------------------------*//*** 计算当前时间和最新一条短信记录的时间差* -1 表示没有任何一条记录*/public int calculateInterval(Long corpid, String mobile) throws Exception{MessageRecord latestRecord = recordDao.findTopByCorpIdAndMobileOrderByCreateTimeDesc(corpid, mobile);if(latestRecord==null){return -1;}DateTime start = new DateTime(latestRecord.getCreateTime());DateTime end = new DateTime();int diff = Seconds.secondsBetween(start,end).getSeconds();return diff;}<span style="color:#cc33cc;">/*** 判断是否在发送最小间隔内 60s* ps:短信通道是否停用,交给控制器处理*/@Overridepublic boolean isMinimumInterval(Long corpid, String mobile) throws Exception{//短信通道MessageChannel channel = messageChannelDao.findByCorpId(corpid); //获得发送最小间隔时间,当前时间和最新一条短信记录的时间差int minimumInterval = channel.getMinimumInterval();int diff = calculateInterval(corpid, mobile);System.out.println("最小间隔diff="+diff);return (diff>=0 && diff<=minimumInterval)?true:false;}</span><span style="color:#cc33cc;">/*** 判断是否,达到预警线*/@Overridepublic boolean isReachWaringLine(Long corpid) throws Exception{//获取警戒线,每日最大发送短信数量MessageChannel channel = messageChannelDao.findByCorpId(corpid); long warningLine = channel.getWarningLine().longValue();Collection<SearchFilter> filters = new ArrayList<SearchFilter>();filters.add(new SearchFilter("corp.id", Operator.EQ, corpid));filters.add(new SearchFilter("createTime", Operator.GE, new DateTime().toString("yyyy-MM-dd")));filters.add(new SearchFilter("createTime", Operator.LE, new DateTime().toString("yyyy-MM-dd")));Specification<MessageRecord> spec = DynamicSpecifications.bySearchFilter(filters, MessageRecord.class);long sendCount = recordDao.count(spec);return (sendCount>warningLine)?true:false;}</span>
}

MessageChannelDao

@Repository
public interface MessageChannelDao extends BaseRepository<MessageChannel, Long>, JpaSpecificationExecutor<MessageChannel> {<span style="color:#cc33cc;">MessageChannel findByCorpId(Long corpid);</span>}

MessageTemplateDao

@Repository
public interface MessageTemplateDao extends BaseRepository<MessageTemplate, Long>, JpaSpecificationExecutor<MessageTemplate>{<span style="color:#009900;">MessageTemplate findByCorpIdAndType(Long corpid,Integer type);</span>}

MessageTemplateEnum

public enum MessageTemplateEnum {
VERIFYCODE(1,"发送验证码"),ORDER_SUCCESS(2,"下单成功"),PAY_SUCCESS(3,"订单支付"),DELIVERY_SUCCESS(4,"订单发货");
private int value;
private String comment;

private MessageTemplateEnum(int value, String comment) {
this.value = value;
this.comment = comment;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}

public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public static MessageTemplateEnum get(int value){
for (MessageTemplateEnum o:MessageTemplateEnum.values()) {
if(o.value ==value){
return o;
}
}
return null;
}

}

Javaweb 短信接口相关推荐

  1. Java的短信接口的使用

    基于阿里大于的升级后的短信接口的使用案例 一:阿里大于的短信接口: 1.1由于阿里大于全面升级成阿里云 云通信,这样给一些新手的朋友带来了一些使用上的一点不方便.下面是阿里云的网址: https:// ...

  2. winForm调用HTTP短信接口

    最近我们使用了一个短信接口,是http的,给出的访问方式都是一个个网址,参数就附在后面,又是?又是&之类.真是第一次见. 怎么调用呢?总不能在服务器开个浏览器,上面在不停地访问对方站点吧?我想 ...

  3. php短信接口源码,比较简单,但也实用

    上次我写过一段php调用webserver的短信接口原码,今天把php的调用http的奉献一下,比较简单,但还是实用的 //短信接口同样是调用http://www.56dxw.com 的 <?p ...

  4. 短信接口在本地调试正常_Pivotal实践:腾讯云短信小应用

    最近登录了一下腾讯云控制台,发现账户下居然每月有100条免费短信可以使用.结合一下最近成都阴晴不定的天气,女友上班老是忘记带伞的现状,于是决定开发一款天气短信提醒小应用,每天早上定时给女友发送天气状况 ...

  5. mob sdk vue 短信验证_短信接口那些事儿,你知道多少?

    短信接口那些事儿,你知道多少? 无数宣传报道,很多人都了解短信接口在企业和用户.企业跟员工之间连接的方便性,而被很多企业商家所应用.只是有些人们还是对短信接口使用原则和用途不是很明白,今天小编就带给大 ...

  6. python发送短信接口_python发送短信和发送邮件

    先注册好 发短信脚本内容 #接口类型:互亿无线触发短信接口,支持发送验证码短信.订单通知短信等. #账户注册:请通过该地址开通账户http://sms.ihuyi.com/register.html ...

  7. php短信接口加密_PHP短信接口、PHP短信验证码接口源码

    PHP短信接口.PHP短信验证码接口源码 时间:2016-06-13 11:53 来源:原创 作者:admin PHP短信接口文档源码,PHP发短信接口,PHP在线发短信,PHP微信发短信接口 /* ...

  8. python短信接口_短信接口DEMO-PYTHON

    云通讯平台-PYTHON短信接口开发示例 #!/usr/bin/python #2.0+++ import requests#导入request模块 import json import hashli ...

  9. java短信接口 调用_带你了解短信接口的调用

    查看接口说明 image.png 注册账号 注册成功的页面如下: image.png 设置短信内容的签名 比如:将短信签名设置为yzc image.png 查取短信接口密钥 image.png 设计J ...

最新文章

  1. [No000011B]为什么有些程序员悄无声息渡过35岁中年危机?
  2. node转发请求 .csv格式文件下载 中文乱码问题 + 文件上传笔记
  3. 历年高考报考人数和录取人数
  4. 使用Docker运行oracle11g企业版和简单配置
  5. cip协议服务器,控制及信息协议(CIP)
  6. NHibernate Step By Step(6)-关联关系
  7. Docker破解AWVS和Nessus
  8. 转 疯狂代码 大型网站架构系列(未完待续)
  9. 电商小程序如何实现分账?
  10. 罗马音平假名中文可复制_200个中文常见姓氏的日语发音,再也不愁起日文名字啦!...
  11. web点播VOD m3u8播放识别为live流 播放几个.ts切片停止播放 排错
  12. html js 邮箱格式,email 格式_JavaScript验证Email邮箱格式的三种方法
  13. Effective C++学习笔记(条款1-34)
  14. 从零开始制作一款打卡类小程序
  15. 爱快路由研究中关于rootfs.gz文件的解压缩问题
  16. Win 11 预览版虚拟机安装
  17. YOLOv5初级问题与报错汇总
  18. ssm教育机构管理系统毕业设计源码010224
  19. 九招最有效防电脑辐射方法
  20. 病毒、蠕虫、木马区别

热门文章

  1. 做微商直播需要哪些东西?
  2. Leetcode 792. 匹配子序列的单词数 C++
  3. 华为ICT大赛辅导——防火墙高可用技术(HA)
  4. C++开源游戏推荐,雷神之锤1/2/3
  5. java.io对象读写_java _io_对象流,能够保存基本数据类型和对象
  6. ubuntu 14.04 apache php mysql_Ubuntu14.04服务器环境下配置PHP7.0+Apache2+Mysql5.7的方法
  7. 麻将开金算法java代_中国麻将(Chinese Mahjong, UVa 11210)【JAVA算法实现】
  8. 用C#生成Excel文件的方法和Excel.dll组件生成的方法
  9. java temporary_临时表temporary table
  10. 关于makefile编译gcc程序的写法 简单只看4点就会了 芯片i5,S3C2440,LPC1759-58-56-54-52-51的makefile模版