客户访问限制管理器
来源:互联网 发布:mud编程 编辑:程序博客网 时间:2024/05/16 01:43
前段时间开发短信收发系统,遇到一个问题,就是有n个对象都可以通过Mobile对象发短信,但同一时刻只允许一个对象进行操作。所以设计了一个客户限制管理器的对象来解决,但由于种种原因没有用到实际系统中。后来经过仔细考虑,发现它不仅可以用于端口的管理,还可用于其他需要针对客户访问数量进行限制的各种服务中去。----这里的“客户”是指要操作该管理器的对象
- /**
- * 客户限制管理器的抽象类<br>
- * 此抽象类实现了对客户访问的限制,当一个客户访问该服务时,可以通过halt(long guestid)方法阻止其他客户进行
- * 访问,防止多个客户同时访问产生的冲突。例如:对通讯端口的访问等。<br>
- *
- * @author none
- *
- */
- public abstract class GuestManager {
- /**
- * 时间:一分钟
- */
- protected static final long ONE_MINUTE = 60L * 1000L;
- /**
- * 时间:一小时
- */
- protected static final long ONE_HOUR = 60L * ONE_MINUTE;
- /**
- * 自动清理客户记录的间隔时间
- */
- private long cleanInterval;
- /**
- * 客户记录<客户标识,最近访问时间>
- */
- private Hashtable<String, String> guests;
- /**
- * 当前限制的客户
- */
- private long limitGuest;
- /**
- * 自动清除过期客户的线程
- */
- private Thread autoCleanThread;
- /**
- * 客户注册
- *
- * @return 返回分配给客户端的唯一标识,如果注册失败,返回-1
- */
- public long login() {
- long guestid = -1L;
- // 增加客户记录
- Hashtable<String, String> guests = getGuests();
- if (guests != null) {
- guestid = System.currentTimeMillis();
- guests.put("" + guestid, "" + guestid);
- update(guestid);
- // if (guests.size() == 1)
- // connect();
- }
- return guestid;
- }
- /**
- * 检查客户是否已经注册
- *
- * @param guestid
- * 客户标识
- * @return 如果客户已经注册返回true,否则返回false
- */
- public boolean isLogin(long guestid) {
- boolean flag = false;
- if (guestid > 0) {
- Hashtable<String, String> guests = getGuests();
- if (guests != null)
- flag = guests.containsKey("" + guestid);
- if (flag)
- update(guestid);
- }// end if (guestid > 0)
- return flag;
- }
- /**
- * 注销客户<br>
- * 如果仍有其他客户在使用此对象,则仅仅注销guestid客户,否则调用disconnect()方法关闭连接。
- *
- * @param guestid
- * 客户标识
- * @return 返回是否成功注销
- */
- public void logout(long guestid) {
- Hashtable<String, String> guests = getGuests();
- if (guests != null) {
- if (guestid > 0 && guests.containsKey("" + guestid)) {
- guests.remove("" + guestid);
- }// end if (guestid > 0 && getGuests().containsKey("" +
- // guestid))
- }// end if (guests != null)
- }
- /**
- * 限制<br>
- * 如果某一客户调用了该方法,那么其他客户将无法访问,直至该客户调用resume()释放。
- *
- * @param guestid
- * 中断标识
- * @return 返回是否成功中断
- */
- public boolean limit(long guestid) {
- boolean flag = false;
- if (isLogin(guestid)) {
- update(guestid);
- if (isLimit(guestid))
- return flag;
- limitGuest = guestid;
- flag = true;
- }// end if (isLogin(guestid))
- return flag;
- }
- /**
- * 释放
- *
- * @param guestid
- * 客户标识
- * @return 返回是否释放成功
- */
- public boolean resume(long guestid) {
- boolean flag = false;
- if (isLogin(guestid)) {
- update(guestid);
- if (limitGuest == guestid) {
- limitGuest = -1L;
- }// end if(haltGuest == guestid)
- flag = !isLimit();
- }
- return flag;
- }
- /**
- * 是否限制其他客户调用
- *
- * @return 返回是否限制其他客户调用
- */
- protected boolean isLimit() {
- boolean flag = false;
- if (limitGuest > 0) {
- long lasttime = Long.parseLong((getGuests().get(
- "" + limitGuest)));
- if (lasttime > 0) {
- // 如果10分钟内无响应,则注释放该客户的中断
- long time = System.currentTimeMillis() - 10L
- * ONE_MINUTE;
- if (time < lasttime)
- flag = true;
- else
- limitGuest = -1;
- }
- }// end if(this.id <= 0)
- return flag;
- }
- /**
- * 该客户是否被限制访问
- *
- * @param haltId
- * 客户标识
- * @return 返回true表示禁止访问,false表示可以访问
- */
- public boolean isLimit(long guestid) {
- boolean flag = true;
- if (isLogin(guestid)) {
- update(guestid);
- flag = isLimit();
- if (flag) {
- if (guestid > 0 && limitGuest == guestid)
- flag = false;
- }// end if(flag)
- }
- return flag;
- }
- /**
- * 取得当前限制客户的标识(该标识是该管理器为客户分配的一个唯一标识)
- *
- * @return 返回当前限制客户的标识
- */
- protected long getLimitGuest() {
- return limitGuest;
- }
- /**
- * 更新客户最近使用时间<br>
- *
- * @param guestid
- * 客户标识
- */
- protected void update(long guestid) {
- runThread();
- Hashtable<String, String> guests = getGuests();
- if (guests != null && guests.containsKey("" + guestid))
- guests.put("" + guestid, ""
- + System.currentTimeMillis());
- }
- /**
- * 运行监听线程
- */
- protected void runThread() {
- // 客户自动清理线程
- if (autoCleanThread != null && !autoCleanThread.isAlive())
- autoCleanThread = null;
- if (autoCleanThread == null) {
- autoCleanThread = new AutoCleanThread();
- autoCleanThread.start();
- }// end if (autoCleanThread == null)
- }
- /**
- * 设置自动清理客户记录的间隔时间
- *
- * @param time
- * 间隔时间(毫秒)
- */
- public void setCleanInterval(long time) {
- if (time > 0)
- cleanInterval = time;
- }
- /**
- * 取得自动清理客户记录的间隔时间
- *
- * @return 返回自动清理客户记录的间隔时间(毫秒)
- */
- public long getCleanInterval() {
- return cleanInterval;
- }
- /**
- * 取得客户记录
- *
- * @return 返回客户记录。格式为<客户标识,最近访问时间>
- */
- protected Hashtable<String, String> getGuests() {
- if (guests == null)
- guests = new Hashtable<String, String>();
- return guests;
- }
- /**
- * 输出错误信息
- *
- * @param err
- */
- public abstract void trace(String err);
- /**
- * 自动清除超时的客户端的线程
- *
- */
- private class AutoCleanThread extends Thread {
- public void run() {
- trace("AutoCleanThread thread start runing...");
- long interval = ONE_HOUR / 4L;
- if (getCleanInterval() > 0)
- interval = getCleanInterval();
- while (autoCleanThread == this && getGuests().size() > 0) {
- long time = System.currentTimeMillis()
- - ONE_HOUR / 2L;
- Enumeration<?> keys = getGuests().keys();
- while (keys.hasMoreElements()) {
- String key = (String) keys.nextElement();
- if (key != null) {
- long lasttime = Long.parseLong(getGuests()
- .get(key));
- if (time > lasttime)
- // 超时
- getGuests().remove(key);
- }// end if (key != null)
- }// end while (keys.hasMoreElements())
- try {
- Thread.sleep(interval);
- } catch (InterruptedException e) {
- e.printStackTrace();
- trace("error - " + e.toString());
- }
- }// end while (mobiles != null && mobiles.size() > 0)
- trace("AutoCleanThread thread end...");
- }
- }
- }
- /**
- * 通讯端口的客户端限制管理器的抽象类<br>
- * 该类继承自GuestManager类,增加了connect()、disconnect()等方法
- *
- * @author none
- *
- */
- public abstract class PortGuestManager extends GuestManager {
- /**
- * 连接
- *
- * @return 返回是否连接成功
- */
- protected abstract boolean connect();
- /**
- * 断开
- *
- * @return 返回是否断开成功
- */
- protected abstract boolean disconnect();
- /**
- * 是否已经连接
- *
- * @return 返回端口是否已经连接
- */
- protected abstract boolean isConnected();
- public long login() {
- long guestid = -1L;
- if (!isConnected())
- connect();
- if (isConnected())
- guestid = super.login();
- return guestid;
- }
- public boolean limit(long guestid) {
- boolean flag = false;
- if (isConnected())
- flag = super.limit(guestid);
- return flag;
- }
- public void logout(long guestid) {
- super.logout(guestid);
- Hashtable<String, String> guests = getGuests();
- if (guests != null)
- if (guests.size() <= 0)
- disconnect();
- }
- public boolean isLimit(long guestid) {
- boolean flag = true;
- if (isConnected())
- flag = super.isLimit(guestid);
- return flag;
- }
- }
- 客户访问限制管理器
- ASP限制客户访问权限
- 基于客户IP地址限制访问
- 关于限制销售访问所有的客户的配置
- 访问限制
- 访问限制
- 访问限制
- 电话第二次访问客户
- QNetworkAccessManager(网络访问管理器)
- QNetworkAccessManager(网络访问管理器)
- java__if for客户登录限制三次
- java获取客户访问IP
- java获取客户访问IP
- 对话#08:访问限制
- Asp限制IP访问
- 限制客户端ip访问
- GMAIL被限制访问
- Asp限制IP访问
- VB高手搜集-常见问题总结(4)
- Imagine——John Lennon 完美的理想
- 内存泄露
- 债券
- 转:提问的智慧
- 客户访问限制管理器
- 在.net窗体程序中使用用户控件
- C++算法题目
- 模式对话框和非模式对话框的区别
- C++ Primer Plus 第五版 第七章 编程练习 5 6
- 引用的用法
- static 用法总结
- 如何修改菜单上的文字
- 费力的项目