短信验证码实现

项目做了登录改密功能需要验证码的功能.

思路:页面点击获取验证码按钮,发送请求到后台,携带用户名作为参数.后台做一个servlet查询该用户的手机号.生成随机验证码.将验证码(+消息)+tel作为参数+其他接口参数拼成url调用第三方服务(云信).

实现:

1.页面js方法

 function get_code_time(){
     var uname = $("#uname").val();
     if(!uname){
         $("#users").html("请先输入您的用户名!");//提示信息
     }else{
         var data="uname="+uname;
         $.get("sendCodes",{uname:uname},function(data){
             code_time();//记时方法        //根据servlet返回的json判断短信发送状态
             if(data=="0"){
                 alert("短信验证码发送失败,请重新获取");
             }else if(data=="1"){
                 alert("用户名未注册");
             }else if(data=="2"){
                 alert("用户名无效或手机号未注册");
             }else if(data=="3"){
                 alert("短信发送成功");
             }else if(data=="4"){
                 alert("验证码超时");
             }
         });
      }
 } var wait = 60; function code_time(){    // alert(567);     if(wait==0){         $("#codes").removeAttr("disabled");//移除获取验证码按钮的disabled属性         $("#codes").val("重新获取验证码");        $("#msgs").val("");         wait =60;     }else{         $("#codes").attr("disabled", true);//设置获取验证码按钮为不可触发         $("#codes").val("(" + wait + ")秒后获取验证码");         wait--;         setTimeout("code_time()", 1000);     } }

2.后台servlet:servlet的路径是上面js方法中的sendCodes

public class SendCodes extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String ret="",uname="",tel = "";
            uname=request.getParameter("uname");
            //判断用户名是否为空
            if(uname==null || "".equals(uname)){
                response.getWriter().write("1");
                return;
            }

            //通过用户名找到电话号码
            String sql = "select ccu.tel from table_user tu where tu.user_name= ? ";
            Session session = new Session(EcConnection.get());//自己封装的获取数据库连接的方法
            try{
                tel = session.queryForColumn(String.class, sql, uname);
            }catch (Exception e) {
                e.printStackTrace();
            }finally{
                session.close();
            }//手机号为空2
        if (tel==null || "".equals(tel)) {
            response.getWriter().write("2");
            return;
        }
        //生成验证码
        int Random  = (int) ((Math.random()*9+1)*100000);//随机生成的6位数(验证码)

        //发送到手机
        //SMSTest sms=new SMSTest();
        String mes= "您的验证码:"+String.valueOf(Random)+",有效时间5分钟" ;
        String msg = "";
        try {
      //由于服务器不能解析调用发送短信接口拼接的url,      //发送短信,调另一服务,其实就是一个servlet,访问返回的是调用短信接口的发送状态码,
            Map<String, String> paraMap = new HashMap<String, String>();
            paraMap.put("mes", mes);
            msg = HttpClient.post("http://127.0.0.1:8082/SendSms/semdsms?tel="+tel, paraMap);//自己封装的httpClientpost方法,下面粘代码
            System.out.println(msg);
            //如果返回的是错误服务错误信息
            if("发送短信错误".equals(msg)){
                response.getWriter().write("0");
                return;
            }
        }catch (Exception e) {
            e.printStackTrace();
            response.getWriter().write("0");
            return;
        }
      //新建一个实体类对象,把它做为一个容器来放验证码,帐号和收取验证码时间。服务不关闭,或是30分钟后就登陆无效

        SmsMessageBean b = new SmsMessageBean(uname,Random+"",System.currentTimeMillis());
        EcContainer.RandomMap.put(uname, b);

        response.getWriter().write("3");
  }

HttpClient访问的http://127.0.0.1:8082/SendSms/semdsms的servlet:service方法

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String tel = req.getParameter("tel");
        String mes = req.getParameter("mes");

        SMSTest sms = new SMSTest();
        PrintWriter pw = resp.getWriter();
        try {
            String msg = sms.send(mes, tel);
            pw.write(msg);
        } catch (Exception e) {
            e.printStackTrace();
            pw.write("发送短信错误");
        }
    }

第三方短息接口:

public class SMS{

    private static final String addr = "http://api.sms.cn/mt/";
    //接口服务注册的用户id
    private static final String userId = "*****";

    /*
     * 如uid是:test,登录密码是:123123
       pwd=md5(123123test),即
       pwd=b9887c5ebb23ebb294acab183ecf0769

           线生成地址:http://www.sms.cn/password
     */    //接口注册的密码:经过拼接字符串和md5加密后的结果   private static final String pwd = "-----------------";
    private static final String encode = "utf8";  //编码
    public String send(String msgContent, String mobile) throws Exception {
        //组建请求
        String straddr = addr +
                        "?uid="+userId+
                        "&pwd="+pwd+
                        "&mobile="+mobile+ //手机号
                        "&encode="+encode+
                        "&content=" +URLEncoder.encode(msgContent, "UTF-8");   //编码格式要对应上,不然就收不到短信

        StringBuffer sb = new StringBuffer(straddr);//发送请求
        URL url = new URL(sb.toString());
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        BufferedReader in = new BufferedReader(new InputStreamReader(
                url.openStream()));

        //返回结果
        String inputline = in.readLine();
        String msg=inputline.substring(9, 12);
        System.out.println("smstest="+msg);
        return msg;
    }
}

自己封装的httpClient方法: 直接使用即可.

public static String post(String baseUrl, Map<String, String> paramsMap) {
        StringBuilder doc = new StringBuilder();
        try {
            StringBuilder queryString = new StringBuilder();
            for (Iterator<String> it = paramsMap.keySet().iterator(); it
                    .hasNext();) {
                String paramName = it.next().toString();
                Object paramValue = paramsMap.get(paramName);
                if (paramValue == null) {
                    paramValue = "";
                }
                queryString
                        .append(paramName)
                        .append("=")
                        .append(URLEncoder.encode(paramValue.toString(), encode))
                        .append("&");
            }
            if (queryString.length() > 0) {
                queryString.deleteCharAt(queryString.length() - 1);
            }
            URL url = new URL(baseUrl);
            HttpURLConnection uc = (HttpURLConnection) url.openConnection();
            uc.setRequestMethod("POST");
            // 设置参数--begin
            uc.setDoOutput(true);
            byte[] b = queryString.toString().getBytes();
            uc.getOutputStream().write(b, 0, b.length);
            uc.getOutputStream().flush();
            uc.getOutputStream().close();
            // 参数设置--end
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    uc.getInputStream(), encode));
            String line = null;
            while ((line = in.readLine()) != null) {
                // 处理特殊字符
                line = line.replace("&amp;", "&");
                doc.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return doc.toString();
    }
时间: 2024-11-09 15:27:50

短信验证码实现的相关文章

实现短信验证码

朋友让帮忙做一个短信验证码工具,对此有了初体验. 1. 编码转换:字符集必须是GB2312格式,字符必须用UrlEncode进行编码. $sms = "短信验证码:2312[大象投资]"; // utf8 echo urlencode(mb_convert_encoding($sms,'gb2312','utf-8')); 2. 通知类短信,如果没有备案,晚上.周末等非工作时间不能发送,必须白天发送,因为那时候才有人工审查. 3. 验证码类短信,随便发,没有太多限制. 了解到上面的内容

atitit.短信&#160;验证码&#160;&#160;破解&#160;&#160;v3&#160;p34&#160;&#160;识别&#160;绕过&#160;系统方案规划----业务相关方案&#160;手机验证码&#160;&#160;.doc

atitit.短信 验证码  破解  v3 p34  识别 绕过 系统方案规划----业务相关方案 手机验证码  .doc 1. 手机短信验证码 vs 图片验证码 安全性(破解成本)确实要高一些1 1.1. 破解基本原则有两种,一种是绕过验证码.一种是拦截1 2. 手机 短信 验证码的 破解 拦截 方式分类2 2.1. 按照源头破解拦截分为源头拦截,中间拦截,,终端拦截...2 2.2. 按照是否软硬件可分类为 纯软件方案与软硬件结合方案2 3. 具体的方法如下2 3.1. 后台服务器漏洞绕过法

Android开发之属于你的短信验证码(一)

不飞则已,一飞冲天;不鸣则已,一鸣惊人---------司马迁 最近工作又有新需求,要求用户在注册的时候需要通过手机验证码,这样做的目的是防止用户通过一个邮箱来随便的注册,那么好,今天我们就 一起来学习一下Android中的短信验证码这一个知识点.如有谬误,欢迎批评指正,如有疑问欢迎留言,谢谢 在说这个知识点前,我们首先来了解下聚合数据 一.聚合数据介绍 聚合数据是一家国内最大的基础数据API提供商,专业从事互联网数据服务.免费提供从天气查询.空气质量.地图坐标到金融基金.电商比价.违章查询等各

Yii2在Form中处理短信验证码的Validator,耦合度最低的短信验证码验证方式

短信验证码在目前大多数web应用中都会有,本文介绍一个基于Yii2 Validator方式的验证码验证方式. 在其他文章中看到的方式大多比较难做到一次封装,多次重用. 使用此方式的好处自然不用多说,Validator支持在Model和Form中使用,使用的时候只需要在rules中添加一条验证规则即可. 第一步: 准备数据表,用来存储短信验证码 CREATE TABLE `tbl_sms_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `to` varch

从平安wifi的短信验证码--也谈产品经理

有钱就是任性,今年很流行. 但在下载后,填手机验证码的时候,我在重复了7次之后,才得以成功. 平时很多短信验证码都是60s,这个时间在一般时段是合适的.但在平安免费注册的1.28日,人数太多,这个经验值就值得商榷了. 对于应用的用户体验来说,收七次验证码,加上60秒倒数的慌乱,即使不考虑短信费用,也是一件让人扯蛋的事情. 所以,产品经理不是小事,百万人次被扯蛋不是好体验.所以,60秒的产品经理是及格,但不是优秀. 多给点时间,对PM来说,有那么难么?! 参见: 平安"土豪式"搅局免费W

实现短信验证码注册

今晚研究了下短信验证码注册,很简单,用的是  云通讯的短信系统(收费的,不过有测试的api给我们做测试).好了,不多说,进入正题. 1.收到到云通讯短信系统注册账号,然后下载他们的封装好的短信api接口代码,解压,然后找到CCPRestSDK.php文件和SendTemplateSMS.php文件,将其拉到根目录文件夹里: 2.打开SendTemplateSMS.php文件,首先注意include_once('./CCPRestSDK.php'),千万别包含错路径了,将云通讯给的测试主账号,主账

发送短信验证码

//发送短信 $("#btnSendcode").click(function () { var $this = $(this); //检查是否输入手机号码 if ($("#txtMobile").val() == "") { $.dialog.alert("对不起,请先输入手机号码!", function () { $("#txtMobile").focus(); }); return false; }

thinkphp集成系列之短信验证码、订单通知

现在这个短信通知泛滥的年代:应用如果没有个短信注册:你都不敢说你是搞开发的: 这个验证码搞起来是不难的:但是如果刚接触也是有点不知从哪下手的迷茫: 先讲下概念: 要想发送验证码:需要至少三项:appid.key.模板id: appid.和key比如较容易理解:各种第三方平台都会提供的:可能叫法不一样: 模板id就是指的短信的内容:例如[淘宝]验证码是192612,请您在5分钟内输入: 这就是一个模板:我们发短信的时候只能改变192612.和5这两个数字:其他是固定的: 因为政策的问题:模板需要申

程序君带你畅聊发送短信验证码

现在不管是网站,还是app等互联网和移动互联网产品,绝大部分注册都是直接用手机号注册登录的,方式就是给手机发送短信验证码,然后把验证码填入,后台程序去匹配判断用户填入的验证码和发送的是否一致. 我最近做的好几个项目都用到了发送短信验证码的这个第三方接口,其实这个发送验证码的原理很简单,实现也很简单. 如下三个图,是我做的其中一个项目的相关效果截图: 我用的比较多的第三方短信接口是容联-云通讯的(http://www.yuntongxun.com/),它的API挺强大的,也挺稳定的,使用也不难,有

自动填充短信验证码(使用ContentObserver)

为了减少用户的操作步骤,在获得短信验证码的时候,我们可以监听特殊手机号码的短信,截取信息当中的短信验证码(其实有很多应用都监听短信例如360短信,一些信用卡或者是记账类的应用). 原理:可以使用一个自定义的BroadcastReceiver来监听短信,在监听结果当中过滤手机号,在需要回填的activity当中实现实例化广播并且实现其回调接口,在接口当中进行回填验证码,在销毁activity时销毁链接.但是这样操作会出现一些问题,由于一些其他的应用也会使用广播监听手机例如QQ通讯录或者是360通讯