由于微信的对access_token 和 jssdk-ticket 都有有效期限制,在页面中调用jssdk函数时需要校验,实现思路如下:
1 在程序里用定时器或者开启线程每7000s计算一次access_token和jssdk-ticket;
2 将access_token 和jssdk-ticket 通过静态变量 static 存在内存中。
3 在action中,设置成员变量 signature,将获取静态变量jssdk-ticket值计算后赋予signature,通过get set 方式将成员变量的值传给jsp页面
4 在jsp页面中通过el表达式获取signature值,noncestr、timestamp,url等值。
程序jsp+action实现
1 编写initservlet类启动线程,在web.xml文件中配置servlet 实现程序启动时即运行servlet.
InitServlet.java
/** * Created by lr on 2015/6/11 */ public class InitServlet extends HttpServlet { public void init() throws ServletException { new Thread(new TokenThread()).start(); } }
web.xml文件
<servlet> <servlet-name>initServlet</servlet-name> <servlet-class>cn.cp.wxphone.servlet.InitServlet</servlet-class> <!-- 程序启动时开始执行 --> <load-on-startup>0</load-on-startup> </servlet>
TokenThread.java
2 在线程中将token、ticket存为静态变量,并实现定时计算。
package cn.cp.wxphone.Thread; import cn.cp.wxphone.manager.JsApiTicketManager; import cn.cp.wxphone.manager.TokenManager; import cn.cp.wxphone.pojo.Token; import cn.cp.wxphone.tag.AppTag; /** * Created by lr on 2015/6/11. */ public class TokenThread implements Runnable { public static Token accessToken = null; public static String jsApiTicket=null; public void run() { while (true) { try { accessToken = TokenManager.getToken(AppTag.AppID,AppTag.AppSecret ); jsApiTicket = JsApiTicketManager.getTicket().getJsi_Ticket(); if (null != accessToken) { System.out.println("获取access_token成功,有效时长{}秒 token:{}" + "," + accessToken.getExpiresIn() + "," + accessToken.getAccessToken()); // 休眠7000秒 Thread.sleep((accessToken.getExpiresIn() - 200) * 1000); // Thread.sleep(30*1000); } else { // 如果access_token为null,60秒后再获取 Thread.sleep(60 * 1000); } } catch (InterruptedException e) {
版权声明:本文为u011462864原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。