本文为老尹同志特别写作!

   主要思路:   本文用MemcachedCache 而不是redis  谁让是定制文章呢!

         用户点击发送验证码,前台传过手机号, 我们在后台生成一个验证码(一般为六位),注意,这个验证码不是说阿里云给我们生成的,而是我们自己生成的 传给阿里云,通过阿里云 发送短信让用户看到我们刚才所生成的验证码,所以说阿里云短信接口就是起到了一个通知作用.

        主要操作:拿到用户手机号  我们生成的六位随机数      放到MemcachedCache里面       key:手机号  value:六位数    我在下面会写MemcachedCache的在当前场景的使用

第一步: 导包   阿里云的包  MemcachedCache的包自己找

<!-- 阿里云短信服务所需 -->
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-core</artifactId>
      <version>4.0.6</version> <!-- 注:如提示报错,先升级基础包版,无法解决可联系技术支持 -->
    </dependency>
    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
      <version>1.1.0</version>
    </dependency>

      第二步:MemcachedCache 工具类:

package com.bfec.match.common.cache;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.alisoft.xplatform.asf.cache.ICacheManager;
import com.alisoft.xplatform.asf.cache.IMemcachedCache;
import com.alisoft.xplatform.asf.cache.memcached.CacheUtil;
import com.alisoft.xplatform.asf.cache.memcached.MemcachedCacheManager;

public class MemcachedCache {
	private static final Log logger = LogFactory.getLog(MemcachedCache.class);
	private static ICacheManager<IMemcachedCache> manager;
	private static IMemcachedCache cache;
	public static final String prefix = "home";
	public static final String NULL_VALUE = "SERIALIZABLE_NULL_OBJECT";
	
	static{
		manager = CacheUtil.getCacheManager(IMemcachedCache.class, MemcachedCacheManager.class.getName());
		manager.setConfigFile("memcached.xml");
		manager.setResponseStatInterval(5 * 1000);
		manager.start();
		cache =manager.getCache("mclient0");
	}

	

	/**
	 * 获取缓存接口
	 * @return
	 */
	public IMemcachedCache getCache() {
		return cache;
	}

	/**
	 * 保存数据
	 * @param key
	 * @param value
	 * @return
	 */
	public void put(int key, Object value) {
		cache.put(String.valueOf(key), value);

	}

	/**
	 * 保存数据
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public void put(String key, Object value) {
		cache.put(key, value);

	}

	/**
	 * 异步存储数据
	 * 
	 * @param key
	 * @param value
	 */
	public void asyncPut(final String key, final Object value) {
		pool.execute(new Runnable() {

			public void run() {
				put(key, value);
			}
		});
	}

	/**
	 * 保存有效期的数
	 * @param key
	 * @param value
	 * @param TTL 数据超时,指定多久以后过期 单位s
	 * @return
	 */
	public void put(String key, Object value, int TTL) {
		cache.put(key, value, TTL);
	}
	
	/**
	 * 保存有效期的数
	 * @param key
	 * @param value
	 * @param TTL 数据超时,指定多久以后过期 单位s
	 * @return
	 */
	public synchronized void putSynchronized(String key, Object value, int TTL) {
		cache.put(key, value, TTL);
	}

	/**
	 * 异步存储数据
	 * 
	 * @param key
	 * @param value
	 * @param TTL 数据超时,指定多久以后过期 单位s
	 */
	public void asyncPut(final String key, final Object value, final int TTL) {
		pool.execute(new Runnable() {
			public void run() {
				put(key, value, TTL);
			}
		});
	}

	/**
	 * 返回数据
	 * @param key
	 * @return
	 */
	public Object get(String key) {
		long start = System.currentTimeMillis();
		Object obj = null;
		try {
			obj = cache.get(key);
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			try {
				obj = cache.get(key);
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		if (logger.isDebugEnabled()) {
			long end = System.currentTimeMillis();
			if ((end - start) > 100)
				logger.debug("----time = " + (end - start));
		}
		return obj;
	}
	
	
	/**
	 * 返回数据
	 * @param key
	 * @return
	 */
	public synchronized Object getSynchronized(String key) {
		long start = System.currentTimeMillis();
		Object obj = null;
		try {
			obj = cache.get(key);
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			try {
				obj = cache.get(key);
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
		if (logger.isDebugEnabled()) {
			long end = System.currentTimeMillis();
			if ((end - start) > 100)
				logger.debug("----time = " + (end - start));
		}
		return obj;
	}

	/**
	 * 返回数据
	 * 
	 * @param key
	 * @return
	 */
	public Object get(int key) {
		return get(String.valueOf(key));
	}

	/**
	 * 删除
	 * 
	 * @param key
	 */
	public void remove(String key) {
		cache.remove(key);
	}

	/**
	 * 删除
	 * 
	 * @param key
	 */
	public void remove(int key) {
		remove(String.valueOf(key));
	}

	/**
	 * 判断缓存是否存在
	 * 
	 * @param key
	 */
	public boolean containsKey(String key) {
		return cache.containsKey(key);
	}

	/**
	 * 判断缓存是否存在
	 * 
	 * @param key
	 */
	public boolean containsKey(int key) {
		return cache.containsKey(String.valueOf(key));
	}

	/**
	 * 线程
	 */
	private static ExecutorService pool = new ThreadPoolExecutor(100, 100, 0L, TimeUnit.NANOSECONDS, new LinkedBlockingQueue<Runnable>()) {
		@Override
		protected void afterExecute(Runnable runnable, Throwable throwable) {
			if (throwable != null) {
				if (throwable.getMessage() != null) {
					if (throwable.getMessage().indexOf("Timeout waiting for value") != -1)
						execute(runnable);
					else {
						logger.error("MemcahcedUtils threadpool task error !!!");
					}
				}
			}
		}
	};
}

第三步:阿里云工具类:

package com.online.college.common.util;

import com.taobao.api.ApiException;
import com.taobao.api.DefaultTaobaoClient;
import com.taobao.api.TaobaoClient;
import com.taobao.api.request.AlibabaAliqinFcSmsNumSendRequest;
import com.taobao.api.response.AlibabaAliqinFcSmsNumSendResponse;

/**
 * Created by Administrator on 2018/5/29.
 */
public class MessageUtil {

    /**
     * 发送短信
     */
    public static void sendMessage(final String signName, final String templateCode, final String msg, final String cellphone) {
        TaobaoClient client = new DefaultTaobaoClient("http://gw.api.taobao.com/router/rest", "", "");
        AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest();
        req.setExtend("123456");
        req.setSmsType("normal");
        req.setSmsFreeSignName(signName);
        req.setSmsParamString(msg);
        req.setRecNum(cellphone);
        req.setSmsTemplateCode(templateCode);
        AlibabaAliqinFcSmsNumSendResponse rsp;
        try {
            rsp = client.execute(req);
            System.out.println("发送成功");
            /*
             * JSONObject object = new JSONObject(rsp.getBody()); JSONObject object1 = (JSONObject) object.get("alibaba_aliqin_fc_sms_num_send_response"); JSONObject result = (JSONObject) object1.get("result");
             */
        } catch (ApiException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        //这个code就是随机生成的六位数
        int code = (int) ((Math.random() * 9 + 1) * 100000);
        String phone= "手机号";
        //将手机号作为key   code作为值 存放到 MemcachedCache 里面   最后一个参数60代表过期时间为60s   可以根据需求自行修改
        MemcachedCache.put(phone,code,60);
        sendMessage("模板名称", "SMS_XXXXXXXX(要改)", "{\"要发送给用户的code\":\"" + code + "\",\"product\":\"【产品信息】\"}", "手机号");
    }
}

这个时候就发送给用户了,现在用户在前台填写完验证码就要 点确定   要到我们后台 去验证 这个验证码  现在ajax去请求

验证 code验证码要单独在写一个接口

public String equalsSms(String phone,String code){
        //获取刚才用户点击发送的时候 放到MemcachedCache 里面的验证码
        Object object = MemcachedCache.get(phone);
        //将当前对象转换为String 也就是我们要的验证码
        String codes = object.toString();
        //与用户的code进行比较 看是不是一样  一样说明验证码正确
        if (codes.equals(code)){
            //验证码正确
            return "1";
        }else{
            //验证码不正确
            return "0";
        }

    }

这个时候 ajax接受着1  说明 验证码 正确 可以执行下一步的操作了

一定要注意,别再理解为验证码是阿里云给你的,而是我们自己的,给阿里云,他只不过是在帮我们传递,我们是把验证码拼接在msg内容里面的!!!

   即使工具类不一样 我也希望你尝试一样,因为过程是一样的,跑起一个,就能理解,随便场景怎么变换!

我已经写的 没接触过java的人都能看懂,这在看不懂真的就是智力问题,我只能说你可以辞职回家了