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. qt 样式表基本用法

    Qt样式表 QT样式表参考CSS层叠样式表设计,不同之处在于QT样式表应用于Widget世界. 可以使用QApplication::setStyleSheet()函数设置到整个应用程序上,也可以使用Q ...

  2. 颜色矩原理及Python实现

    原理 颜色矩(color moments)是由Stricker 和Orengo所提出的一种非常简单而有效的颜色特征.这种方法的数学基础在于图像中任何的颜色分布均可以用它的矩来表示.此外,由于颜色分布信 ...

  3. 两步让你的mobile traffic通过fiddler代理传送

    mobile app运行时由于调试网络相关的内容非常不便,所以如果能够让iphone通过桌面主机来跑traffic,那么在pc上就能非常清楚地检查mobile app和后端之间有什么问题了. 幸运的是 ...

  4. sql server——分组查询(方法和思想)

    思想 先排序在汇总 sql server里分组查询通常用于配合聚合函数,达到分类汇总统计的信息.而其分类汇总的本质实际上就是先将信息排序,排序后相同类别的信息会聚在一起,然后通过需求进行统计计算. 使 ...

  5. IIS7.5使用web.config设置伪静态的方法

    IIS 7和IIS 7.5及以后的版本估计都会使用web.config来实现伪静态规则,于是我们以前的伪静态文件必须更改.网上找了一圈,还没有发现比较全面的web.config伪静态规则,于是我们这里 ...

  6. 【深入理解JAVA虚拟机】第5部分.高效并发.2.线程安全和锁优化

    1 概述 对于这部分的主题“高效并发”来讲,首先需要保证并发的正确性,然后在此基础上实现高效. 2 线程安全 <Java Concurrency In Practice> 的作者Brian ...

  7. SAP S/4HANA里如何创建Customer主数据以及执行后续处理

    来自Jerry的同事Zhang Sean. 1, Launch tcode: BP and select the Organization 2, Maintain the information fo ...

  8. WEB开发的jsp例子标签库(jstl)的使用

    <!-- e1 --> <%@ page language="java" contentType="text/html; charset=UTF-8&q ...

  9. 数据库JDBC的基本内容

    JDBC 基本流程 首先向项目中导入jar包 创建如下代码 Class.forName("com.mysql.jdbc.Driver"); String url = "j ...

  10. luogu P4275 萃香的请柬

    嘟嘟嘟 打表不难发现,序列的长度以及序列中1的个数都是斐波那契数列.因为第 i 秒1的个数由 i - 1的1和 i - 2的0变换而来,那么f[i] = f[i - 1] + f[i - 2].序列的 ...