微信平台无法使用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;

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
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值