微信平台无法使用session的解决方案(Java)

重新调整了超时清除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;{private String openid;private static long time;private ArrayList<SessionData> sessionData = new ArrayList<SessionData>();public static long getTime() {return time;}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;}timeMin(){time = time – 60*1000;}setTime(){time = 10*60*1000;}//判断计时器是否为零public boolean timeStop(){if ( time == 0 )return true;;}public long whatTime(){return time;}(SessionData data){int i = search(data.getName());setTime();if ( i<0 ){//添加sessionData.add(data);}else{sessionData.set(i, data);}}remove(String name){int i = search(name);if (i>=0){sessionData.remove(i);}}public int search(String name){if (!sessionData.isEmpty()){setTime();for ( int i=0 ; i<sessionData.size() ; i++){if ( sessionData.get(i).getName().equals(name) )return i;}}return -1;}public String get(String name){int i = search(name);setTime();if (i>=0){return sessionData.get(i).getValue();}return null;}}package com.xlzx.wx.session;/** @author zmhawk* @date 2015-02-09* /import java.util.ArrayList;import com.xlzx.wx.thread.SessionThread;{private static ArrayList<Session> sessionList = new ArrayList<Session>();public static ArrayList<Session> getSessionList() {return sessionList;}setSessionList(ArrayList<Session> sessionList) {SessionList.sessionList = sessionList;}public SessionList(){}int search (String openid) {if (sessionList.isEmpty())return -1;else {int size = sessionList.size();for ( int i=0 ; i<size ; i++){if ( sessionList.get(i).getOpenid().equals(openid) )return i;}}return -1;}timeMin(String openid) {int i = search(openid);if (i>=0)sessionList.get(i).timeMin();}boolean timeStop(String openid) {int i = search(openid);if ( sessionList.get(i).timeStop() )return true;;}remove(String openid) {int i = search(openid);if (i>=0)sessionList.remove(i);}setSeesion(String name, String value, String openid){System.out.println(“setSeesion ” + name + ” ” + value + ” ” + openid);int i = search(openid);if (i>=0){SessionData data = new SessionData();data.setName(name);data.setValue(value);sessionList.get(i).set(data);}}setSeesion(String openid){System.out.println(“setSeesion ” + openid);int i = search(openid);if (i<0){//建立线程System.out.println(“创建计时线程”);Runnable t = new SessionThread(openid);Thread time = new Thread(t);time.start();Session session = new Session();session.setOpenid(openid);sessionList.add(session);}}removeData(String name, String openid){int i = search(openid);if (i>=0){sessionList.get(i).remove(name);}}public static String getData(String name, String openid){System.out.println(“getData ” + name + ” ” + openid);int i = search(openid);if (i>=0){String value = sessionList.get(i).get(name);System.out.println(name + “值为 ” + value);return value;}return null;}public static boolean sleep(){return true;}public static long getTime(String openid){int i = search(openid);if (i>=0){return sessionList.get(i).whatTime();}return 0;}}package com.xlzx.wx.thread;/***计时线程,超时销毁session** @author zmhawk* @date 2015-02-09* /import com.xlzx.wx.session.SessionList;{private String openid;public SessionThread(String openid){this.openid = openid;}public void run() {// while(SessionList.sleep()) {while( true ){System.out.println(“计时线程启动”);if ( SessionList.search(openid) >= 0 ){try {//休眠1分钟System.out.println(“开始休眠”);Thread.sleep(60*1000);System.out.println(“已休眠一分钟,”);if (SessionList.search(openid) >= 0 ){if ( ! SessionList.timeStop(openid) ){SessionList.timeMin(openid); //每隔60秒苏醒一次,将计时器减60秒}if ( SessionList.timeStop(openid) ){ //如果计时器为零SessionList.remove(openid);//删除sessionSystem.out.println(“删除session”);}System.out.println(“剩余时间: ” + SessionList.getTime(openid)/1000 + “秒”);}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {break;}}System.out.println(“计时线程结束”);}}

那些System.out是我在调试时监视程序流程的,没删,就一块贴上来了。

微笑拥抱每一天,做像向日葵般温暖的女子。

微信平台无法使用session的解决方案(Java)

相关文章:

你感兴趣的文章:

标签云: