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. CSS 3篇(持续更新)

    1.关于盒子模型 css盒子模型 又称框模型 (Box Model) ,包含了元素内容(content).内边距(padding).边框(border).外边距(margin)几个要素.如图: 理解c ...

  2. Windows下sc create命令行添加/创建/修改服务

    添加服务: sc create TestService binpath= "D:\TestApp\TestService.exe" 注意:所有的等号和值之间需要一个空格(等号前不要 ...

  3. SQL Server ->> FIRST_VALUE和LAST_VALUE函数

    两个都是SQL SERVER 2012引入的函数.用于返回在以分组和排序后取得最后一行的某个字段的值.很简单两个函数.ORDER BY字句是必须的,PARITION BY则是可选. 似乎没什么好说的. ...

  4. 【Leetcode】【Medium】Binary Tree Inorder Traversal

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...

  5. ZT JAVA WeakReference

    JAVA WeakReference 分类: JAVA 2012-08-28 16:08 305人阅读 评论(0) 收藏 举报 javareferencehashmapcacheclassnull 在 ...

  6. Android MVP 简析

    原地址:https://segmentfault.com/a/1190000003927200 在Android中应用MVP模式的原因与方法的简析,写的简单易懂.

  7. Django的开发服务的搭建和使用

    创建一个项目¶ 如果这是你第一次使用Django,你需要完成一些初始化操作. 即,你需要自己用代码来创建一个Django项目 ——一个Django实例所需的设置集合,包括数据库的配置.Django的配 ...

  8. 在Windows 7和10上显示上次登录帐户信息

    组策略: 计算机配置->管理模板->Windows组件->Windows登录选项 现在注销并重新登录以查看会发生什么. 在进入桌面之前,用户必须确认该消息 注册表: 打开: &quo ...

  9. 20145238-荆玉茗 《网络对抗》-逆向及Bof基础实践

    20145238荆玉茗<网络对抗>-逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:m ...

  10. Selenium应用代码(登录)

    这篇可以不看,主要是为了以后的应用代码(传参)做铺垫. import java.awt.Rectangle; import java.awt.image.BufferedImage;import ja ...