在本周的项目中用到了一个手机短信验证的功能,虽然代码都是已经写好了的,自己只是拿来就用,但事后还是得学习一下思路的。

短信验证整体思路

主要流程如下

基础功能还是比较简单的毕竟发短信用到是现成的接口,本项目用到的短信验证接口的网站是这个

  /**     * 批量发送短信     *     * @param phoneNumbers     * @param message      短信内容     * @return 成功200 ,不成功400(短信验证错误或未传入发送手机号)     * @throws IOException      */    @Override        public Integer sentMessage(Set<String> phoneNumbers, String message) throws IOException {            HttpClient client = new HttpClient();            PostMethod post = new PostMethod(sOpenUrl);            // 在头文件中设置转码            post.addRequestHeader("Content-Type", ContentType);            // 注册的用户名            NameValuePair[] data = {new NameValuePair("action", "sendOnce"),                    // 注册成功后,登录网站使用的密钥                    new NameValuePair("ac", account),                    // 手机号码                    new NameValuePair("authkey", authkey),                    new NameValuePair("cgid", cgid.toString()),                    new NameValuePair("c", message),                    new NameValuePair("m", String.join(",", phoneNumbers))}; // 设置短信内容            post.setRequestBody(data);            client.executeMethod(post);            post.releaseConnection();            return post.getStatusCode();       }

小难点

主要的难点我认为主要就是:怎么保存已经发送的验证码并判断是否失效。
在本项目中是直接通过一个服务中的hashMap把验证码与手机号的信息直接存到内存中,毕竟本项目同时注册人数不可能太多,而几个字符串内存还是承受的住的。

        HashMap<String, HashMap<String, Object>> hashMap = new HashMap<>();  // 缓存值        String EXPIRE_DATE_KEY = "expireDate";  // 数据失效时间关键字(指在某个时间失效)        String VALUE_KEY = "value";  // 存数据的KEY                // 存放缓存的方法        static void put(String key, Object object, Integer expireTime) {            HashMap<String, Object> hashMap = new HashMap<>();            hashMap.put(MemoryCacheService.VALUE_KEY, object);            hashMap.put(MemoryCacheService.EXPIRE_DATE_KEY, System.currentTimeMillis() + expireTime * 1000);            MemoryCacheService.hashMap.put(key, hashMap);        }

通过手机号查询验证码

    /**     * 获取缓存     *     * @param key     * @return     */    static Object get(String key) {        if (MemoryCacheService.shouldClearExpiredData()) {            logger.info("定期清除过期缓存");            MemoryCacheService.clearExpiredData();        }        HashMap<String, Object> cachedObject = MemoryCacheService.getCachedObjectByKey(key);        if (cachedObject == null) {            return null;    // 未获取到缓存数据,返回null        }        if (MemoryCacheService.isExpired(cachedObject)) {            logger.info("缓存过期,清除缓存.返回null");            MemoryCacheService.remove(key);            return null;        }        return cachedObjec

总结

本以为这个功能的博客能写不少,毕竟还是让我感觉很新鲜的,但真的开始才发现没啥重点可写,限制ip请求次数的功能
还写掉了,要是详细写怎么实现的感觉又没必要,毕竟逻辑实际上还是很简单的看看流程图就能理解了,就这样吧。