java开发微信session管理

来源:互联网 发布:盒子下载软件 编辑:程序博客网 时间:2024/06/16 11:51

  主要用途:主要用于session管理。在微信开发时,因为通过微信服务器转发,而丢失cookie和seesion,无法使用session,所以使用微信服务器post过来的openid当做sessionid ,openid是一个唯一不重复的,这样每个用户的状态是可以独立的
参考地址:http://www.ablanxue.com/shtml/201502/26386_1.shtml
参考文章比较乱,但给我带来了灵感。我的这个和他的基础相同,不相同的是:
1.我采用一个线程来管理session集合,减少内存消耗,session失效时间可能会多一秒
2.我session采用session创建时间,session保存时间

package com.fkhd.weixin.session;/** * session键值对实体类 */public class SessionData {/** * 键 */private String name;/** * 值 */private Object value;public String getName() {return name;}public void setName(String name) {this.name = name;}public Object getValue() {return value;}public void setValue(Object value) {this.value = value;}}
package com.fkhd.weixin.session;import java.util.ArrayList;import java.util.List;/** * session实体类 */public class Session {/** * 唯一标识 */private String openid;/** * 创建时间 */private long createTime;  /** * 有效时间 */private long validTime;/** * 键值对集合  */private List<SessionData> sessionDatas=new ArrayList<SessionData>();public String getOpenid() {return openid;}public void setOpenid(String openid) {this.openid = openid;}public long getCreateTime() {return createTime;}public void setCreateTime(long createTime) {this.createTime = createTime;}public long getValidTime() {return validTime;}public void setValidTime(long validTime) {this.validTime = validTime;}public List<SessionData> getSessionDatas() {return this.sessionDatas;}public void setSessionDatas(List<SessionData> sessionDatas) {this.sessionDatas=sessionDatas;} }
package com.fkhd.weixin.session;import java.util.ArrayList;import java.util.List;/** * session集合 */public class SessionList {/** * session集合 */public static List<Session> sessionList=new ArrayList<Session>();/** * 查找session中是否有指定项 * @param openid session标识 * @return 若存在openid相同的session,返回在集合中对应的位置,若不存在返回-1 */public static int search(String openid){int size = sessionList.size(); for ( int i=0 ; i<size ; i++){ if ( sessionList.get(i).getOpenid().equals(openid)) return i;}return -1;           }/** * 移除session */public static void remove(String openid) {int i = search(openid);if (i>=0)sessionList.remove(i);}/** * 向session中存入数据 * @param name * @param value * @param openid */public static void setSeesion(String name, Object 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).getSessionDatas().add(data);}} /** * 创建session  * @param openid */public static void setSeesion(String openid){System.out.println("setSeesion " + openid);int i = search(openid); if (i<0){ //建立线程 Session session = new Session();//两个小时会话session.setValidTime(120*60*1000);//当前时间戳session.setCreateTime(System.currentTimeMillis());//session唯一标识session.setOpenid(openid);//添加sessionsessionList.add(session);}}/** * 根据name,获取session对象中键值对 * @param name * @param openid */public static Object getSession(String name, String openid){System.out.println("getData " + name + " " + openid);int i = search(openid); if (i>=0) {SessionData sessionData=null;for (SessionData sData : sessionList.get(i).getSessionDatas()) {if (sData.getName().equals(name)) {sessionData=sData;}}if (sessionData!=null){Object value = sessionData.getValue();System.out.println(name + "值为 " + value);return value;} }return null;}/** * 根据name,移除session对象中键值对 * @param name * @param openid */public static void removeData(String name, String openid){int i = search(openid); if (i>0){sessionList.get(i).getSessionDatas().remove(name);}}}
package com.fkhd.weixin.session;import java.util.ArrayList;import java.util.List;/** * 更新session集合状态 */public class SessionThread implements Runnable{ public void run() { while(true){//当前时间戳long currentTime=System.currentTimeMillis();//休眠1分钟try {if (SessionList.sessionList.isEmpty()){ System.out.println("现在还没session,休息10分钟!");//休眠10分钟Thread.sleep(10*60*1000);}else {//用来装需要删除的元素List<Session> delList = new ArrayList<Session>();//遍历session集合,将时间戳到期的提出for (Session session : SessionList.sessionList) {//当前时间大于创建时间加保存时间的session移除if (currentTime>session.getCreateTime()+session.getValidTime()) {delList.add(session);System.out.println("要移除的session,openid为:"+session.getOpenid());}}//移除要删除的元素SessionList.sessionList.removeAll(delList);//休眠1分钟Thread.sleep(60*1000);}} catch (InterruptedException e) {e.printStackTrace();}}}}


1 0
原创粉丝点击