废话不多说,先放上大概步骤。
- 准备一个自启动的Servlet(在Web.xml里面配置映射
- 在自启动的Servlet中开启一个线程,随项目启动就去获取accesstoken(注意路径,名称
- 之后让线程休眠,休眠时间最好小于7200秒,让线程提前去获取新的accesstoken(然后存进对象
直接上代码
目录
自启动的Servlet类
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 当tomcat启动时需要同时启动的Servlet,用来获取accesstoken
// 需要在项目的Web.xml里配置此servlet自启动
@WebServlet("/AccessTokenServlet")
public class AccessTokenServlet extends HttpServlet {
// init()初始化方法
public void init() {
new Thread(new GetTokenThread()).start(); //启动进程
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
在Servlet中开启的线程类
package org.utils;
import org.bean.AccessToken;
public class GetTokenThread implements Runnable {
// 注意是静态的
public static AccessToken accessToken = null;
public void run(){
while (true){
try{
accessToken = this.getAccessToken();
if(null!=accessToken){
Thread.sleep(7000 * 1000); // 获取到accesstoken 休眠7000秒
}else{
Thread.sleep(1000*3); // 获取的accesstoken为空 休眠3秒
}
}catch(Exception e){
System.out.println("发生异常:"+e.getMessage());
e.printStackTrace();
try{
Thread.sleep(1000*10); // 发生异常时设定1秒后重试
}catch (Exception e1){
}
}
}
}
/**
* 获取access_token
*/
private AccessToken getAccessToken(){
AccessToken accessToken = NetUtils.getAccessToken();// 实际获取accesstoken的工具类
return accessToken;
}
}
用来获取accesstoken的工具类
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.bean.AccessToken;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
public class NetUtils {
public static final String APPID = "微信公众平台的APPID";
public static final String APPSECRET = "微信公众平台的APPSECRET";
public static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
// 网络连接工具
public static String doGetStr(String urlPath) throws IOException {
// 创建url对象,帮助获取URLConnection的连接
URL url = new URL(urlPath);
// URLConnection连接
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
// 设置请求为get
urlConnection.setRequestMethod("GET");
// 打开输入流
urlConnection.setDoInput(true);
// 关闭输出流
urlConnection.setDoOutput(false);
// 建立连接
urlConnection.connect();
// 获取输入流后包装
BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8"));
String len;
StringBuilder sb = new StringBuilder();
// 读微信后台返回的内容
while((len = br.readLine()) != null) {
sb.append(len);
}
// JSON格式的数据
return sb.toString();
}
public static AccessToken getAccessToken() {
// 将请求路径保存在常量“ACCESS_TOKEN_URL”内,然后动态替换“APPID”和“APPSECRET”
String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET);
AccessToken token = new AccessToken();
try {
// doGet请求的方法
String json = doGetStr(url);
// 将微信服务器返回的数据进行解析
ObjectMapper mapper = new ObjectMapper();
token = mapper.readValue(json, AccessToken.class);
} catch (IOException e) {
e.printStackTrace();
}
// 返回token
return token;
}
}
最后是AccessToken类
public class AccessToken {
private String access_token;// accesstoken
private String expires_in;// accesstoken过期时间
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getExpires_in() {
return expires_in;
}
public void setExpires_in(String expires_in) {
this.expires_in = expires_in;
}
}
Web.xml模板
为了方便直接使用,放上Web.xml的模板,直接拷贝修改路径即可
<servlet>
<servlet-name>AccessTokenServlet</servlet-name>
<servlet-class>
访问Servlet的路径
</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AccessTokenServlet</servlet-name>
<url-pattern>/servlet/AccessTokenServlet</url-pattern>
</servlet-mapping>