JavaJava

JavaWeb之实现短信验证

2019-07-01  本文已影响0人  17f6ebdcf197

短信验证的背景

短信验证的思路

通常而言短信验证码的原理是刚开始时,用户在前台填写资料,点击“获取短信验证码”按钮,后台通过先前的设定,接收到前台指令,就生成一条随机验证码,一般是由一串数字或字母组成,调用短信接口,经过服务器响应做大,发送到用户的移动端。用户在前台相应的输入框内输入验证码,后台经过一定的算法支持,而对用户提交的内容和后台存储好的信息比对,如果两者都没有误差,那么用户的身份得到确认,就能够进行下一步操作。

  1. 客户填入手机号,通过客户端点击获取验证码按钮,验证手机号是否有效,有效则客户端发送请求到后台服务器中,客户端开始计时60s,不通过则返回;
  1. 服务器,验证手机号是否被注册或有效,通过则调用第三方的短信通信接口短信(手机号 + 验证码), 然后回调结果,成功则将验证码存入临时全局变量中,失败则返回提示,不通过则返回。

服务器端,收到请求后,用户发送过来的验证码和事前放入临时存储的验证码阿做对比,相同通过,负责提示验证码无效。

🍎核心代码

/**
     * TODO: 生成手机验证码🔓
     * */
    public static String getRandomAuthCode(){
        IdWorker worker = new IdWorker(1,1,1);
        String AuthCodeTmp = String.valueOf(worker.nextId());
        return  AuthCodeTmp.substring(AuthCodeTmp.length() - 6, AuthCodeTmp.length());

    }
    /**
     * TODO: 发送手机验证码📱
     *
     * @return
     */
    public static void SMSVerification(String phoneNumber, String authCode) throws IOException{

        //发送内容
        String content = "您的手机号:"+ phoneNumber + ",验证码:"+ authCode + ",请及时完成验证,如不是本人操作请忽略。";
        // 创建StringBuffer对象用来操作字符串
        StringBuffer sb = new StringBuffer("https://api.chanyoo.net/sendsms?");

        // 向StringBuffer追加平台帐号
        sb.append("username=******");  

        // 向StringBuffer追加调用密码
        sb.append("&password=******");

        // 向StringBuffer追加手机号码
        sb.append("&mobile=" + phoneNumber);

        // 向StringBuffer追加短信内容转URL标准码
        sb.append("&content=").append(URLEncoder.encode(content, "UTF-8"));

        // 创建url对象
        URL url = new URL(sb.toString());
        System.out.println(url.toString());

        // 打开url连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        // 设置url请求方式GET或者POST
        connection.setRequestMethod("GET");

        // 发送请求
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

//         返回发送结果
        String inputline = in.readLine();

        // 输出返回结果
        System.out.println(inputline);
    }

🍎 控制层

package com.niit.clouddemo.controller;

import com.alibaba.fastjson.JSONObject;
import com.niit.clouddemo.pojo.front.User;
import com.niit.clouddemo.service.IRegisterService;
import com.niit.clouddemo.util.BaseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;



@Controller
@RequestMapping(value = "/register")
public class RegisterController {

    @Autowired
    private IRegisterService iRegisterService;

    /**
     * 👨‍💻: 定义全局变量
     * */
    static public String PHONE_AUTH_CODE;
    /**
     * TODO: 🚗到达注册界面
     * */
    @RequestMapping(value = "/toRegister.do")
    public String toRegisterPage(HttpServletRequest request, HttpServletResponse response, Model model){
        System.out.println("-----> " + PHONE_AUTH_CODE);
        return "f_register";
    }

    /**
     * TODO: 📱获取短信验证码
     * @param: phone 请求手机号
     * */
    @ResponseBody
    @RequestMapping(value = "/getAuthCode.do", method = RequestMethod.GET)
    public void getAuthCode(@RequestParam("phone") String phone){

        String tempCode = BaseUtil.getRandomAuthCode();
        PHONE_AUTH_CODE = tempCode;
        System.out.println("phoneNum: " + phone);
        System.out.println("tempCode: " + tempCode + "PHONE_AUTH_CODE: " + PHONE_AUTH_CODE);

//        // 👨‍💻: 执行验证码的发送
        try {
            BaseUtil.SMSVerification(phone,tempCode);
            System.out.println("TEST 发送成功----------------->");
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.err.println("【手机号码】: " + phone + "【手机验证码:】" + PHONE_AUTH_CODE );
    }


    /**
     * TODO:🔥 用户注册验证
     * */
    @RequestMapping(value = "/registerValidate.do", method = RequestMethod.POST)
    public @ResponseBody
    JSONObject regiserValidate(@RequestBody Map<String,Object> map){

        String suid = BaseUtil.getUID();
        String susername = (String) map.get("username");
        String sphone = (String) map.get("phone");
        String spassword = (String) map.get("password");
        String svercode = (String) map.get("vercode");
        System.err.println("用户UID" + suid);
        System.err.println("用户名称:" + susername);
        System.err.println("用户手机号码:" + sphone);
        System.err.println("用户密码:" + spassword);
        System.err.println("用户验证码: " + svercode);

        User user = new User();
        user.setUserid(suid);
        user.setUsername(susername);
        user.setPhone(sphone);
        user.setPassword(spassword);

        String result = iRegisterService.registerValidate(user);
        //返回异常结果JSON数据
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("message", result );
        return jsonObject;

    }



}

github 手机验证源码

github 雪花❄算法-分布式系统的唯一id生成算法

上一篇下一篇

猜你喜欢

热点阅读