本文为老尹同志特别写作!
主要思路: 本文用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的人都能看懂,这在看不懂真的就是智力问题,我只能说你可以辞职回家了