用到了两个文件
package com.xinrong.adaptor.facade;
import java.math.BigDecimal;
import java.util.Map;
@SuppressWarnings("rawtypes")
public interface CacheFacade {
public final static int PUT_IF_NOT_CARE = 0;
public final static int PUT_IF_EQUAL = 1;
public final static int PUT_IF_GREATER = 2;
public final static int PUT_IF_EQUAL_OR_GREATER = 3;
public final static int PUT_IF_LESS = 4;
public final static int PUT_IF_EQUAL_OR_LESS = 5;
public Object get(Object key);
public void put(Object key, Object value);
public boolean putIfNotExist(Object key, Object value);
public void remove(Object key);
public Object getExt(String mapName, Object key);
public void putExt(String mapName, Object key, Object value, int maxSize);
public boolean putIfNotExistExt(String mapName, Object key, Object value,
int maxSize);
public void removeExt(String mapName, Object key);
public void putAllExt(String mapName, Map map, int maxSize);
public BigDecimal add(Object key, BigDecimal value);
public BigDecimal addExt(String mapName, Object key, BigDecimal value,
int maxSize);
public boolean putIf(Object key, Comparable<Object> value, int ifWhat);
public boolean putIfExt(String mapName, Object key,
Comparable<Object> value, int ifWhat, int maxSize);
public boolean putIfNotExistBySecond(Object key, Object value,Long second);
}
package com.xinrong.adaptor.facade;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.Map;
import org.apache.commons.collections.map.LRUMap;
public class CacheLocal implements CacheFacade {
@SuppressWarnings("unchecked")
private static Map<Object, Object> lruMap = new LRUMap(100000);
@SuppressWarnings("unchecked")
private final static Map<String, Map<Object, Object>> mapMap = Collections
.synchronizedMap(new LRUMap(10000));
@Override
public Object get(Object key) {
synchronized (lruMap) {
return lruMap.get(key);
}
}
@Override
public void put(Object key, Object value) {
synchronized (lruMap) {
lruMap.put(key, value);
}
}
@Override
public boolean putIfNotExist(Object key, Object value) {
synchronized (lruMap) {
if (lruMap.containsKey(key)) {
return false;
} else {
lruMap.put(key, value);
return true;
}
}
}
@Override
public void remove(Object key) {
synchronized (lruMap) {
lruMap.remove(key);
}
}
@Override
public Object getExt(String mapName, Object key) {
Map<Object, Object> targetMap;
if (mapName != null) {
targetMap = mapMap.get(mapName);
if (targetMap == null)
return null;
} else
targetMap = lruMap;
synchronized (targetMap) {
return targetMap.get(key);
}
}
@Override
public void putExt(String mapName, Object key, Object value, int maxSize) {
Map<Object, Object> targetMap;
if (mapName != null) {
targetMap = creatSubMapIfNotExist(mapName, maxSize);
} else
targetMap = lruMap;
synchronized (targetMap) {
targetMap.put(key, value);
}
}
@Override
public boolean putIfNotExistExt(String mapName, Object key, Object value,
int maxSize) {
Map<Object, Object> targetMap;
if (mapName != null) {
targetMap = creatSubMapIfNotExist(mapName, maxSize);
} else
targetMap = lruMap;
synchronized (targetMap) {
if (targetMap.containsKey(key)) {
return false;
} else {
targetMap.put(key, value);
return true;
}
}
}
@Override
public void removeExt(String mapName, Object key) {
Map<Object, Object> targetMap = mapMap.get(mapName);
if (targetMap == null)
return;
synchronized (targetMap) {
targetMap.remove(key);
}
}
@Override
public BigDecimal add(Object key, BigDecimal value) {
return addExt(null, key, value, 0);
}
@Override
public BigDecimal addExt(String mapName, Object key, BigDecimal value,
int maxSize) {
Map<Object, Object> targetMap;
if (mapName != null) {
targetMap = creatSubMapIfNotExist(mapName, maxSize);
} else
targetMap = lruMap;
synchronized (targetMap) {
BigDecimal ret = (BigDecimal) targetMap.get(key);
if (ret != null) {
value = value.add(ret);
}
targetMap.put(key, value);
}
return value;
}
@Override
public boolean putIf(Object key, Comparable<Object> value, int ifWhat) {
return putIfExt(null, key, value, ifWhat, 0);
}
@Override
public boolean putIfExt(String mapName, Object key,
Comparable<Object> value, int ifWhat, int maxSize) {
Map<Object, Object> targetMap;
if (mapName != null) {
targetMap = creatSubMapIfNotExist(mapName, maxSize);
} else
targetMap = lruMap;
synchronized (targetMap) {
Object ret = targetMap.get(key);
if (ret != null) {
int cmp = value.compareTo(ret);
switch (ifWhat) {
case CacheFacade.PUT_IF_EQUAL:
if (cmp != 0)
return false;
break;
case CacheFacade.PUT_IF_GREATER:
if (cmp <= 0)
return false;
break;
case CacheFacade.PUT_IF_EQUAL_OR_GREATER:
if (cmp < 0)
return false;
break;
case CacheFacade.PUT_IF_LESS:
if (cmp >= 0)
return false;
break;
case CacheFacade.PUT_IF_EQUAL_OR_LESS:
if (cmp > 0)
return false;
break;
}
}
targetMap.put(key, value);
}
return true;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public void putAllExt(String mapName, Map map, int maxSize) {
Map<Object, Object> targetMap = creatSubMapIfNotExist(mapName, maxSize);
synchronized (targetMap) {
targetMap.putAll(map);
}
}
@SuppressWarnings("unchecked")
private Map<Object, Object> creatSubMapIfNotExist(String mapName,
int maxSize) {
Map<Object, Object> targetMap = mapMap.get(mapName);
if (targetMap == null)
synchronized (mapMap) {
targetMap = mapMap.get(mapName);
if (targetMap == null) {
targetMap = new LRUMap(maxSize);
mapMap.put(mapName, targetMap);
}
}
return targetMap;
}
@Override
public boolean putIfNotExistBySecond(Object key, Object value,Long second) {
synchronized (lruMap) {
if (lruMap.containsKey(key)) {
if(Long.valueOf(value.toString()) - Long.valueOf(lruMap.get(key).toString()) < second){
return false;
}
}
lruMap.put(key, value);
return true;
}
}
}
使用
@Resource
private CacheLocal cacheLocal;
public void validateCaptcha(String uuid, String code) {
if (StringUtils.isEmpty(uuid) || StringUtils.isEmpty(code)) {
throw new EsException("请输入验证码");
}
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
String captcha = (String) cacheLocal.get(verifyKey);
if (StringUtils.isEmpty(captcha)) {
throw new EsException("验证码错误");
} else {
if (!captcha.equals(code)) {
throw new EsException("验证码错误");
}
}
cacheLocal.remove(verifyKey);
}
public AjaxResult getCode() {
Random random = new Random();
int type = random.nextInt(2);
AjaxResult ajax = AjaxResult.success();
String uuid = IdUtils.simpleUUID();
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
String capStr = null, code = null;
BufferedImage image = null;
if (type == 1) {
String capText = captchaProducerMath.createText();
capStr = capText.substring(0, capText.lastIndexOf("@"));
code = capText.substring(capText.lastIndexOf("@") + 1);
image = captchaProducerMath.createImage(capStr);
} else {
capStr = code = captchaProducer.createText();
image = captchaProducer.createImage(capStr);
}
log.info("uuid=========>" + uuid + " code=========>" + code);
cacheLocal.put(verifyKey,code);
FastByteArrayOutputStream os = new FastByteArrayOutputStream();
try {
ImageIO.write(image, "jpg", os);
} catch (IOException e) {
return AjaxResult.error(e.getMessage());
}
ajax.put("uuid", uuid);
ajax.put("img", Base64.encode(os.toByteArray()));
return ajax;
}