Google Guava Cache:本地缓存实现,支持多种缓存过期策略,具体看官网:http://ifeve.com/google-guava/
使用案例:
1:先依赖guava的jar包
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
2:添加配置文件VcodeCacheManager.java
package com.cmcc.util;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
public class VcodeCacheManager {
public static Cache<String, String> cacheTicket = CacheBuilder.newBuilder().expireAfterWrite(7200, TimeUnit.SECONDS) // 过期时间7200s,TimeUnit.SECONDS可改
.maximumSize(1000)// 最大缓存数量
.build();
public static String getTicket(String key) {
if(key == null){
return "";
}
try {
return cacheTicket.get(key, new Callable<String>() {
public String call() throws Exception {
return "";
}
});
} catch (ExecutionException e) {
}
return null;
}
public static void putTicket(String key, String value) {
cacheTicket.put(key, value);
}
public static void remove(String key) {
cacheTicket.invalidate(key);
}
}
3:使用由于微信的分享使用有效期为7200s,需要将所需的ticket的值放到cacheTicket缓存中,过期后就更新ticket值,这样每次取到ticket都是有效的。
package com.cmcc.controller.rest.share;
import java.io.IOException;
import net.sf.json.JSONObject;
import org.apache.commons.httpclient.HttpException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.cmcc.util.Constant;
import com.cmcc.util.StringUtil;
import com.cmcc.util.VcodeCacheManager;
import com.cmcc.util.alipay.util.httpClient.HttpProtocolHandler;
import com.cmcc.util.alipay.util.httpClient.HttpRequest;
import com.cmcc.util.alipay.util.httpClient.HttpResponse;
import com.cmcc.util.alipay.util.httpClient.HttpResultType;
@RestController
@RequestMapping(value = "/share")
public class ShareController {
@RequestMapping(value = "/shareOthers", method = RequestMethod.GET)
public @ResponseBody String shareContent() throws HttpException, IOException {
String ticketResult;
String ticketVal = VcodeCacheManager.getTicket("ticket");
if(StringUtil.isEmpty(ticketVal)){
HttpRequest request = new HttpRequest(HttpResultType.BYTES);
//设置编码集
request.setCharset(Constant.CHARSET);
request.setMethod(HttpRequest.METHOD_GET);
request.setUrl(Constant.TOKEN_URL);
request.setQueryS