重新调整了超时清除Session的处理方式,采用一个线程管理所有Session,而不是每一个Session新建一个线程,详情看后边补充部分。
我们知道,微信平台是属于被动式的应答模式,用户发送一条消息或者进行点击菜单上一个按钮,服务器收到请求后进行处理然后回应,整个过程不能超过5秒钟,结束。而要进行较复杂的需要分步骤操作的逻辑时,就需要session机制来辅助,因为我们不能要求用户像我们程序员一样在一行输入一大串参数,那样用户体验太差了,一步一步引导式的操作是最好的。
但是因为微信的所有请求都是通过腾讯的服务器转发的,也就是说所有的请求都是从同一个服务器发来的,这样原本的session机制便失效了,就好比程序原来靠人的长相来分辨和谁在对话,然后所有人的消息都通过一个人转告时,你就无法分辨了。原本的session的识别方式好像是通过cookie,每一次会话生成一个独一无二的sessionID,浏览器的所有请求都会带上这个ID,而腾讯服务器支不支持cookie还不好说,如果不支持的话,那就相当于负责向你转告别人消息的那人是个无头幽灵。。。
这时我们可以换个思路,因为那人在转告时会告诉你是这条消息是谁发过来的,也就是 FromUserName 参数,这是一个独一无二的openid,相当于sessionID,所以我们可以自己写一个类似于session的模块。
先看代码:
package com.xlzx.wx.session;
/*
* @author zmhawk
* @date 2015-02-09
* /
public class SessionData {
private String name;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
package com.xlzx.wx.session;
/*
* @author zmhawk
* @date 2015-02-09
* /
import java.util.ArrayList;
public class Session {
private String openid;
private static long time;
private ArrayList<SessionData> sessionData = new ArrayList<SessionData>();
public static long getTime() {
return time;
}
public static void setTime(long time) {
Session.time = time;
}
public ArrayList<SessionData> getSessionData() {
return sessionData;
}
public void setSessionData(ArrayList<SessionData> sessionData) {
this.sessionData = sessionData;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
//计时器减一分钟
public void timeMin(){
time = time - 60*1000;
}
//重置计时器,10分钟
public void setTime(){
time = 10*60*1000;
}
//判断计时器是否为零
public boolean timeStop(){
if ( time == 0 )
return true;
else
return false;
}
public long whatTime(){
return time;
}
//添加或修改
public void set(SessionData data){
int i = search(data.getName