package com.zq.web.context.windows;

import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;

import com.zq.utils.DateUtils;
import com.zq.utils.string.StringUtils;

/**
*
* windows桌面应用会话管理容器SessionContainer
*
* Created by MyEclipse. Author: ChenBin E-mail: chenbin_2008@126.com Date:
* 2016年12月4日 Time: 上午9:53:03
*/
public class SC {
private static Logger log = Logger.getLogger(SC.class);
/**
* 超时毫秒数,如果容器中的session对象超过该时间未更新则会被清除掉
*/
private static long timeOut = 3600000L;

private static Map<String, Session> container = new HashMap<String, Session>();

// 私有化容器构造函数
private SC() {
}

/**
* Description : 通过sessionId获取对应的session实体
*
* @author : ChenBin
* @date : 2016年12月13日 下午2:33:24
*/
public static Session get(String sessionId) {
if (!StringUtils.compareTrim(sessionId))
return null;
Session session = container.get(sessionId);
if (session != null)
session.updateLastTime();
return session;
}

/**
* Description : 往会话容器中新增会话实体
*
* @author : ChenBin
* @date : 2016年12月4日 上午10:47:15
*/
public static Session create() {
Session session = Session.me();
SC.put(session);
return session;
}

public static Session put(Session sen) {
if (sen == null)
return sen;
if (!StringUtils.compareTrim(sen.getSessionId())) {
log.debug("sessionid不能为空!");
return sen;
}
return container.put(sen.getSessionId(), sen);
}

/**
* Description : 移除指定的Session对象
*
* @author : ChenBin
* @date : 2016年12月4日 上午10:06:40
*/
public static void remove(Session sen) {
if (sen != null)
SC.remove(sen.getSessionId());
}

/**
* Description : 通过sessionId移除指定的sessionId
*
* @author : ChenBin (E-Mail:chenbin_2008@126.com)
* @date : 2017年3月9日 下午4:30:12
*/
public static void remove(String sessionId) {
if (StringUtils.compareTrim(sessionId))
container.remove(sessionId);
}

public static long getTimeOut() {
return timeOut;
}

public static void setTimeOut(long timeOut) {
SC.timeOut = timeOut;
}

/**
* Description : 处理session容器中的session对象,如果已经过期则sessionId对应的会话对象将会被销毁
*
* @author : ChenBin (E-Mail:chenbin_2008@126.com)
* @date : 2017年3月9日 下午5:24:05
*/
public static void handleTimeOutSession(String sessionId) {
Session sen = SC.get(sessionId);
if (sen == null)
return;
if (DateUtils.timeDifference(sen.getLastUpdateTime()) > SC.timeOut)
SC.remove(sessionId);
}

}

/*************************************************以上为工具方法*********************************************/

package com.zq.web.context.windows;

import java.util.HashMap;
import java.util.Map;

import com.zq.utils.DateUtils;
import com.zq.utils.system.WindowsAppUtils;

/**
*
* 简单自定义会话对象
*
* Created by MyEclipse. Author: ChenBin E-mail: chenbin_2008@126.com Date:
* 2016年12月4日 Time: 上午9:57:12
*/
public class Session {
/**
* 会话id
*/
private String sessionId;
/**
* 创建时间毫秒数
*/
private long createTime;
/**
* 最后更新时间
*/
private long lastUpdateTime;
/**
* 在会话对象中保存的内容
*/
private Map<Object, Object> sessionContent;
/**
* 会话类型:windows-10;浏览器-20;Android-30;IOS-40;
*/
private int sessionType;
/**
* 会话是否已失效(失效-true;有效-false)
*/
private boolean invalid;

/**
* Description :定义构造函数,必须传入sessionId
*
* @author : ChenBin
* @date : 2016年12月4日 上午10:23:05
*/
private Session(String sessionId) {
this.sessionId = sessionId;
this.createTime = DateUtils.getTimeMillis();
this.lastUpdateTime = createTime;
this.sessionContent = new HashMap<Object, Object>();
}

/**
* Description : 通过key获取指定参数
*
* @author : ChenBin
* @date : 2016年12月4日 上午10:38:16
*/
public Object getAttribute(Object key) {
updateLastTime();
return this.sessionContent.get(key);
}

/**
* Description : 往会话中保存参数
*
* @author : ChenBin
* @date : 2016年12月4日 上午10:39:26
*/
public void setAttribute(Object k, Object v) {
updateLastTime();
this.sessionContent.put(k, v);
}

/**
* Description : 获取Session对象的方法
*
* @author : ChenBin
* @date : 2016年12月4日 上午10:24:17
*/
public static Session me() {
return new Session(WindowsAppUtils.sessionIDGenerator());
}

/**
* Description : 更新最后更新时间戳
*
* @author : ChenBin
* @date : 2016年12月4日 上午10:43:32
*/
public void updateLastTime() {
this.lastUpdateTime = DateUtils.getTimeMillis();
}

public String getSessionId() {
return sessionId;
}

public long getLastUpdateTime() {
return lastUpdateTime;
}

public int getSessionType() {
return sessionType;
}

public void setSessionType(int sessionType) {
this.sessionType = sessionType;
}

public boolean isInvalid() {
return invalid;
}

public void setInvalid(boolean invalid) {
this.invalid = invalid;
}

}

自己写的代码实现Session的更多相关文章

  1. .net学习之Session、Cookie、手写Ajax代码以及请求流程

    1.IIS 7 以上版本集成了两种模式,一种是经典模式,一种是集成模式(直接将asp.net框架集成到IIS中) 2.浏览器和服务器端通过什么技术来实现的?Socket(套接字),通信的语法是HTTP ...

  2. jQuery之父:每天都写点代码

    去年秋天,我的“兼职编程项目”遇到了一些问题:要不是从 Khan Academy 的项目里挪出时间来的话,我根本没办法将不理想的进度弥补上. 这些项目遇到了一些严重的问题.之前的工作我主要是在周末,有 ...

  3. Wix#可以直接写C#代码来生成Wix的MSI安装文

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Wix#可以直接写C#代码来生成Wix的MSI安装文.

  4. 关于 OnCloseQuery: 顺序、不能关机等(所有的windows的广播消息都是逐窗口传递的)——如果一个窗体的OnCloseQuery事件中如果写了代码那么WM_QUERYENDSESSION消息就传不过去了msg.result会返回0,关机事件也就停止了

    系统关闭窗体的事件顺序为: OnCloseQuery ----> OnClose ----> OnDestroy 下面的代码说明问题: unit Unit3; interface uses ...

  5. Lombok : 让你写 Java代码像C#一样爽

    前言 我曾经是一名 .Net 开发,如今的我是一名 Java 开发者.在我享受着 Java 成熟的生态时,我常常怀念 c# 简洁的语法:自动属性.类型推断.自动初始化器 .... 鱼,我所欲也,熊掌亦 ...

  6. 不写一行代码,利用常用工具和软件批量下载URL资源

    有时候会遇到这种情况:想从某个网站下载一批东西,目标URL是比较规整的,而且结构都一样(仅某些字段不同).但又懒得开IDE专门写个脚本去弄,今天就和大家分享一下,如何利用手边常用的软件和工具,不用写一 ...

  7. 开箱即用(out-of-box)的Redis序列号生成器,不用再写任何代码,你值得拥有

      先看整体效果 把简单的东西“傻瓜化”是软件开发追求的目标之一.请看下图: 左边是在 application.yml 里配置了3个生成器,右边可以直接注入到代码中使用,注意,不用写任何代码.这酸爽. ...

  8. golang写业务代码,用全局函数还是成员函数

    在golang中,函数划分为全局函数和成员函数,在使用的时候,有种情况,会产生一些疑惑的,就是在写业务代码的时候,使用全局函数好像会比较方便,一般业务代码,都不会复用,都是针对特定的业务进行编程,要复 ...

  9. 如何写 go 代码 (How to Write Go Code 翻译)

    目录 1. 写在前面的话 2. 介绍 3. 代码组织 3.1. 工作区 3.2. GOPATH 环境变量 3.3. Package 路径 3.4. 第一个 GO 程序 3.5. 第一个 GO 库 3. ...

随机推荐

  1. Mysql存储Emoji表情[为何utf8不能存储以及如何使Mysql能够存储Emoji表情]

    https://segmentfault.com/a/1190000008533577

  2. zan扩展安装

    官方地址 https://github.com/youzan/zan //提示缺少libcurl扩展时候安装 yum install libcurl-devel //安装完zan.so php -m提 ...

  3. 新款 2018款macbook Pro 装双系统教程

    首个阅读量将破万的文章,感谢支持.防止无良爬虫,开头附上原文链接:http://www.cnblogs.com/xueyudlut/p/7498115.html ------------------- ...

  4. Java日志系统

    前言 各组件之间的关系: slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实 ...

  5. [零基础学JAVA]Java SE基础部分-04. 分支、循环语句

    转自:http://redking.blog.51cto.com/27212/116751 1.课程名称:分支.循环 本季为JAVA程序中最重要的部分,在讲解的时候除了讲解各种主要的控制语句(分支语句 ...

  6. 使用redux开发的简单步骤

    一.安装redux包 npm install redux --save 二.根据APP数据结构或者后台请求的数据结构拟定state的大致结构. 可以把state写成一个对象字面量,放在reducer文 ...

  7. sql 获取每个分组的前N条记录的写法

    SELECT * FROM ( --根据 tb表的name进行分组,根据年龄排序 SELECT * , ROW_NUMBER() OVER ( PARTITION BY name ORDER BY a ...

  8. Intellij IDEA 快速补全for循环:fori

    快速补全for循环:fori 效果:

  9. 在CentOS实现mysql数据库的自动备份

    数据是一个比较重要的数据,经常需要备份,每次都手动比较麻烦.本脚本主要现实在CentOS中实现对数据库的备份和保留最近十五天的备份文件.避免太多无用陈旧的备份占用空间. #!/bin/bashid=& ...

  10. BZOJ1037:[ZJOI2008]生日聚会Party(DP)

    Description 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party.hidadz带着朋友们来到花园中,打算坐成一排玩游戏. 为了游戏不至于无聊,就座的方案应满足如下条件: ...