Java用户注册手机短信验证码校验功能实现

标签: 手机短信验证码校验  webservice  java发短信  Java编程

验证用户提交的手机短信验证码,如果验证码错误就跳回到当前页面。在短信验证码未填写或未正确填写时,就关闭底**册按钮的功能,只有短信验证码通过校验后才打开注册按钮的功能。第二种方式是所有输入项全部填写完成后一并提交给服务器,服务器统一进行校验。本例采用第二种方式。
由于后台短信验证码校验时如果不通过其他的注册信息没法成功提交,所以要在CustomerAction类中先将短信校验这一项默认设置为通过,才能一并获得提交注册的信息。

//调用SMS服务发送短信
        //String result = SmsUtils.sendSmsByHTTP(model.getTelephone(),msg);
        String result = "000/XXX";
        if(result.startsWith("000")){
            //以"000"开头表示短信发送成功
            return NONE;
        }else{
            //发送失败,就抛出一个运行期异常
            throw new RuntimeException("短信发送失败,信息码:"+result);
        }

要保证页面输入框input中的name值跟后台的domain类中的属性的值保持一致。

<div class="signup" ng-app="signupApp" ng-controller="signupCtrl">
                    <div class="col-md-9 signupbox">
                        <form id="customerForm" action="customer_regist.action" method="post" class="form col-md-6">
                            <div class=" form-group">
                                <label for="inputaccount" class="col-sm-3 control-label"><b>*</b>手机号</label>
                                <div class="col-sm-8">
                                    <input type="text" class="form-control" name="telephone" ng-model="telephone" id="inputaccount" placeholder="请输入手机号">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="inputaccount" class="col-sm-3 control-label"><b>*</b>验证码</label>
                                <div class="col-sm-5">
                                    <input type="text" class="form-control" id="inputaccount" placeholder="请输入验证码" name="checkcode">
                                </div>
                                <div class="col-sm-3 song">
                                    <!-- 发送验证码按钮 -->
                                    <a class="btn btn-default" 
                                        ng-click="getCheckCode(telephone)" 
                                        ng-bind="btnMsg">
                                    </a>
                                </div>

                            </div>
                            <div class="form-group">
                                <label for="inputaccount" class="col-sm-3 control-label"><b>*</b>密码</label>
                                <div class="col-sm-8">
                                    <input type="password" class="form-control" id="inputaccount" placeholder="6-16位数字或英文字母" name="password">
                                    <p class="text-right grey">安全强度:*****</p>
                                </div>

                            </div>

                            <div class="form-group">
                                <label for="inputaccount" class="col-sm-3 control-label"><b>*</b>确认密码</label>
                                <div class="col-sm-8">
                                    <input type="password" class="form-control" id="inputaccount" placeholder="6-16位数字或英文字母">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="inputaccount" class="col-sm-3 control-label"><b>*</b>绑定邮箱</label>
                                <div class="col-sm-8">
                                    <input type="email" class="form-control" id="inputemail" placeholder="请输入需要绑定的邮箱" name="email">
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="col-sm-offset-3 col-sm-8 song">
                                    <div class="checkbox">
                                        <label>
                                            <input type="checkbox"> 查看并同意<a href="#"> 《速运快递服务协议》</a>
                                        </label>
                                    </div>

                                </div>
                            </div>
                            <div class="form-group signbtn">
                                <div class="col-sm-offset-3 col-sm-8 song">
                                    <a class="btn btn-danger" href="javascript:$('#customerForm').submit();">注册</a>
                                </div>
                            </div>

                        </form>

                    </div>

给a标签中的【注册】按钮添加点击事件,当click时直接提交表单数据。
注:在一般的form表单中都会有一个用于提交的input,这个input的type属性值为submit,所以点击这个input时就会将form中的数据进行提交。本例中考虑到整体的美观和服务于其他业务逻辑,并没有在form中设置这么一个input,因而需要使用原生的js技术将一个普通的a标签转换成按钮,然后给该按钮注册点击事件,只要一点击就提交表单数据。

<a class="btn btn-danger" href="javascript:$('#customerForm').submit();">
注册
</a>

接下来编写后台Action代码,要注意一个问题,因为本例中我使用了webservice技术,在signup.html所在的项目中并没有一个实体类用来保存前端页面提交过来的数据,最终数据被提交到了另外一个crm系统crm_management中,因此需要在crm_management系统中提供一个regist的服务,否则用户注册的数据时没法保存的。
CustomerAction代码要点如下:
① 用户注册成功后,设置跳转到regist_success.html页面。
② 校验短信验证码,如果校验不通过,就跳回到注册页面。
③ 需要在@Action中配置两个结果集@Result,一个是注册成功后需要跳转的页面,一个是注册失败后需要跳转的页面。
④ 使用属性驱动接收页面提交的验证码。提供set方法。生成的短信验证码已经被保存到session中了,不信?!查看代码中我已经编写了ServletActionContext.getRequest().setAttribute(model.getTelephone,randomCode)来将短信验证码保存到session中。
⑤ 直接从session中获取之前生成的短信验证码,因为之前保存验证码时使用的是手机号码作为key,所以可以直接通过手机号来获取验证码。短信验证码实际上就是使用RandomStringUtils工具类中的randomNumeric(4)方法生成了一个4位数的随机数字字符串。通过ServletActionContext.getRequest().getSession().getAttribute(model.getTelephone());来获取短信验证码。
⑥ 如果短信验证码为空或者不等于我们随机生成的验证码,那么就是校验失败,将客户的页面跳转到注册页面signup.html。直接return INPUT;返回一个input视图。
⑦ 注册成功就调用webservice连接crm来保存用户的注册信息。直接return SUCCESS;返回一个SUCCESS视图。
完整的CustomerAction代码,包含上例中生成短信验证码的业务代码:

@ParentPackage("json-default")
@Namespace("/")
@Controller
@Scope("prototype")
public class CustomerAction2 extends BaseAction<Customer> {
    @Action(value="customer_sendSms")
    public String sendSms() throws IOException{
        //生成短信验证码
        String randomCode = RandomStringUtils.randomNumeric(4);
        //将短信验证码保存到session中
        ServletActionContext.getRequest().getSession().setAttribute(model.getTelephone(),randomCode);
        //编辑短信内容
        String msg = "你好!本次获取的验证码位:"+randomCode;
        //调用SMS服务发送短信
        //String result = SmsUtils.sendSmsByHTTP(model.getTelephone(),msg);
        String result = "000/XXX";
        if(result.startsWith("000")){
            //以"000"开头表示短信发送成功
            return NONE;
        }else{
            //发送失败,就抛出一个运行期异常
            throw new RuntimeException("短信发送失败,信息码:"+result);
        }
    }

    //属性驱动接收页面填写的验证码
    private String checkCode;
    public void setCheckCode(String checkCode) {
        this.checkCode = checkCode;
    }
    @Action(value="customer_regist",results={@Result(name="success",type="redirect",location="signup_success.html"),
            @Result(name="input",type="redirect",location="signup.html")})
    public String regist(){
        //先校验短信验证码,如果不通过就跳回登录页面
        //从session中获取之前生成的短信验证码
        String checkcodeSession = (String) ServletActionContext.getRequest().getAttribute(model.getTelephone());
        if(checkcodeSession==null||!checkcodeSession.equals(checkCode)){
            System.out.println("短信验证码错误!");
            //短信验证码错误
            return INPUT;
        }
        //调用webservice连接crm保存客户信息
        System.out.println("客户注册成功...");
        return SUCCESS;
    }
}

这里写图片描述

版权声明:本文为a772304419原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a772304419/article/details/78872132

智能推荐

接口回调基础理解

接口回调听起来好像很厉害的样子,但其实只要能够搞清楚代码的执行过程,多看几遍,并且认真思考,再加上勤奋的练习,熟练掌握简单的接口回调并不是难题,接下来,我会用一个简单的例子,来带大家一起分析代码的执行过程,以及这样写的好处,以及这样写的思路。 我们知道recyclerView是没有自带点击事件的,所以这里我们就拿给recyclerView添加点击事件为例。 ok 我们做好了一个简单的recycer...

Mac下的myeclipse安装

1.首先要安装jdk跟jre 2.安装过程中可能会遇到您需要安装旧 Java SE 6 运行环境才能打开此 Java 应用程序的提示     解决办法就是安装ava for os x 2015-001.,这里不要点系统给你提示的界面,根本没法下载 我上传的链接,可以直接下载:链接: https://pan.baidu.com/s/1qYbT6os 密码: x...

30分钟实战树莓派连接到微软云Azure IoT Hub并将数据可视化

更多内容,关注公众号: 树莓派是很多动手达人必备的小玩具,本节内容,让我们拿出树莓派,在30分钟内,将树莓派连接到微软云Azure的IoT Hub,然后将温湿度曲线可视化。 本实战完整视频: 树莓派连接到Azure IoT Hub 并用时序见解展示数据 本节内容中,树莓派发送的数据是模拟出来的,并没有真实的连接到传感器,您可以选购不同的传感器来采集真实的环境信息。 Azure IoT Hub 为我...

spring cloud gateway 整合ribbon、nacos discovery实现负载均衡源码简析

1 spring cloud gateway 负载均衡入口 spring cloud gateway 使用 LoadBalancerClientFilter 来实现载均衡的功能,该过滤器通过LoadBalancerClient.choose(ServerWebExchange exchange)方法来获取目标实例。 LoadBalancerClient 为spring-cloud-commons包...

VUE快速搭建项目

作为一个前端小辣鸡 今天在网上找到了 一个 快速 无脑式搭建vue项目的方式 分享一下 我们采用图形界面创建项目。通过 vue ui 命令启动 vue cli service 后,访问 http://localhost:8000/project/create 可以直接进入项目创建流程。 步骤中有些地方值得一提 详情:包管理器指定 npm,后续在npm 配置文件(.npmrc)中可手动指定国内镜像源...

猜你喜欢

2017-8-10 Struts2学习笔记二

一、web.xml文件的编写 1. 由于struts2是用过滤器拦截请求的,所以需要在web.xml文件中配置一个过滤器。 2. 这个过滤器的名字叫StrutsPrepareAndExecuteFilter,中文名曰struts准备和执行过滤器,就是这个过滤器拦截我们在地址栏的请求。 3. 查找这个过滤器,将它的全路径写在filter-class标签中,eclipse可以使用Shift+Ctrl+...

Windows Terminal配置Git

文章目录 Windows Terminal配置Git 效果 下载和安装 配置Windows Terminal 配置其它命令行 Windows Terminal配置Git 效果 先上效果图: 下载和安装 Windows Terminal是微软开发的面向命令行用户的全新,现代,功能丰富,高效的终端应用程序。 它包括Windows命令行社区最常请求的许多功能,包括对选项卡,富文本,全球化,可配置性,主题...

CW MCU v11.1学习笔记1

说明:通过处理器专家创建芯片为MC9S08DZ60的工程,按键控制LED 一、CW11.1软件界面布局 1、双击桌面图标,打开软件,设置工作空间 软件主界面 调试界面 处理器专家界面 有时经常调整(删除)面板布局,如果想恢复布局,可在Window工具栏下的Reset Perspective选项来复位面板布局 二、新建工程 1、在C/C++模式下,在Commander面板下点击New MCU pro...

栈-综合应用-中缀表达式转后缀表达式

综合应用 使用栈完成一个计算表达式的结果 输入:2 * 3 - 4 / 5 * 0.2 => 0.08 思路 使用index -> 2 (第一个为止),数字放入数栈,符号放入符号栈,符号栈为空,直接放入。 遇到第二个运算符,与符号栈中的符号进行运算符优先级比较。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gvhtZGbo-1601271684334)...

git分支管理

一、主分支Master 首先,代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。 Git主分支的名字,默认叫做Master。它是自动建立的,版本库初始化以后,默认就是在主分支在进行开发。 二、开发分支Develop 主分支只用来分布重大版本,日常开发应该在另一条分支上完成。我们把开发用的分支,叫做Develop。 这个分支可以用来生成代码的最新隔夜版本(nig...