onlineserviceimpl.java

来自「社区文章采用的是平板、树形自由选择的两种展示方式」· Java 代码 · 共 271 行

JAVA
271
字号
/* 
 * Created on 2007-6-11
 * Last modified on 2007-11-16
 * Powered by GamVan.com
 */
package com.yeqiangwei.club.service.user;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import com.yeqiangwei.club.service.ServiceLocator;
import com.yeqiangwei.club.service.ServiceWrapper;
import com.yeqiangwei.club.model.Online;
import com.yeqiangwei.club.model.User;
import com.yeqiangwei.club.service.security.IPLockService;
import com.yeqiangwei.club.service.util.BasicInfoService;
import com.yeqiangwei.club.util.BeanUtils;
import com.yeqiangwei.club.view.model.UserView;
import com.yeqiangwei.util.FormatDateTime;
import com.yeqiangwei.util.ParamUtils;
import com.yeqiangwei.util.StringHelper;
import com.yeqiangwei.util.Validator;

public class OnlineServiceImpl implements OnlineService{
	
	private static final Logger logger = Logger.getLogger(OnlineServiceImpl.class);
	
	public static Map<String,Online> ONLINE_MAP;
	
	public static Map<String,User> ONLINE_USER_MAP;
	
	private static int USERS = 0; //在线总数
	
	private static int MEMBERS = 0; //在线会员总数
	
	private static long TIMEOUT = 0;
	
	private static boolean ISRUNNING = false; //清理正在执行
	
	static {
		if(ONLINE_MAP==null){
			ONLINE_MAP = new HashMap<String, Online>();
		}
		if(ONLINE_USER_MAP==null){
			ONLINE_USER_MAP = new HashMap<String, User>();
		}
		if(TIMEOUT==0){
			TIMEOUT = getTimeOut();
		}
	}
	
	public Online findByIp(String ip){
		return ONLINE_MAP.get(ip);
	}

	/**
	 * 判断用户是否在线
	 */
	public boolean online(User model) {
		if(Validator.isEmpty(ONLINE_USER_MAP.get(this.onlinekey(model)))){
			return false;
		}else{
			return true;
		}
	}

	/**
	 * 判断用户是否在线
	 */
	public boolean online(UserView view) {
		if(Validator.isEmpty(view)){
			return false;
		}
		User model = new User();
		BeanUtils.copyProperties(model,view);
		return this.online(model);
	}

	
	private static long getTimeOut(){
		int refreshTime = getBasicInfoService().findOnly().getRefreshTime();
		String temp = FormatDateTime.dateAdd(FormatDateTime.SECOND,refreshTime,"yyyyMMddHHmmss");
		return FormatDateTime.formatDateTimeToLong(temp);
	}
	
	public void timedOut(){
		if(TIMEOUT > FormatDateTime.now()||ISRUNNING){
			logger.info(TIMEOUT+" >= "+FormatDateTime.now());
			return ;
		}else{
			logger.info(TIMEOUT+" < "+FormatDateTime.now());
			ISRUNNING = true;
			TIMEOUT = getTimeOut();
		}
		Iterator<String> it = ONLINE_MAP.keySet().iterator(); 
		List<String> keylist = new ArrayList<String>();
		int c = 0;
		while(it.hasNext()){
			String key = it.next();
			Online model = ONLINE_MAP.get(key);
			if(model.getTimeout()<FormatDateTime.now()){
				USERS--;
				if(model.getUser()!=null){
					MEMBERS--;
					ONLINE_USER_MAP.remove(this.onlinekey(model.getUser()));
				}
				//ONLINE_MAP.remove(model.getIp());
				c++;
				keylist.add(model.getIp());
			}
		}
		for(String key:keylist){
			ONLINE_MAP.remove(key);
		}
		logger.info("清理超时在线用户 "+c+" 人,任务结束!");
		ISRUNNING = false;
	}
	
	public List<Online> findAll() {
		USERS = 0;
		MEMBERS = 0;
		List<Online> list = new ArrayList<Online>();
		Set<String> set =  ONLINE_MAP.keySet();   
		Iterator<String> it = set.iterator();   
		while(it.hasNext()){
			String key = it.next();
			Online model = ONLINE_MAP.get(key);
			list.add(model);
			USERS++;
			if(model.getUser()!=null){
				MEMBERS++;
			}
		}
		Comparator<Online> comp = new OnlineComparator();
		Collections.<Online>sort(list,comp);
		return list;
	}

	@SuppressWarnings("unchecked")
	public void utils(HttpServletRequest request) {
		if(ISRUNNING){
			return;
		}
		String url = request.getRequestURI();
		if(request.getMethod().equalsIgnoreCase("post")
				|| StringHelper.indexOf(url.toLowerCase(), "ajax")!=-1
				|| url.endsWith(".do"))
		{
			url = "/club/main.jsp?act=break";
		}else{
			StringBuffer params = new StringBuffer("?");
			Enumeration<String> paramNames = request.getParameterNames(); 
			if(!Validator.isEmpty(paramNames)){
				while(paramNames.hasMoreElements()){
					String name = paramNames.nextElement();
					params.append(name);
					params.append("=");
					params.append(ParamUtils.getStringParameter(request, name));
					params.append("&");
				}
			}
			url += params.substring(0,params.length()-1);
		}
		logger.debug("url="+url);
		String ip = request.getRemoteAddr();
		long timeout = getTimeOut();
		if(Validator.isEmpty(ONLINE_MAP.get(ip))){
			Online model = new Online();
			model.setIp(ip);
			model.setTimeout(timeout);
			model.setDatetime(FormatDateTime.now());
			model.setUser(UserLogin.getUser(request));
			model.setLastUrl(url);
			model.setMessage((String) request.getAttribute("message"));
			model.setReferer(request.getHeader("referer"));
			model.setAgent(request.getHeader("User-Agent"));
			model.setIPLockEntry(getIPLockService().getEntry(ip));
			model.setUrlCount(1);
			List<String> list = new ArrayList<String>();
			list.add(url);
			model.setUrlList(list);
			ONLINE_MAP.put(ip,model);
			if(!Validator.isEmpty(model.getUser())){
				MEMBERS++;
				ONLINE_USER_MAP.put(this.onlinekey(model.getUser()), model.getUser());
			}
			USERS++;
		}else{
			Online model = ONLINE_MAP.get(ip);
			model.setTimeout(timeout);
			model.setDatetime(FormatDateTime.now());
			model.setLastUrl(url);
			model.setMessage((String) request.getAttribute("message"));
			model.setReferer(request.getHeader("referer"));
			model.setAgent(request.getHeader("User-Agent"));
			model.setIPLockEntry(getIPLockService().getEntry(ip));
			model.setUrlCount(model.getUrlCount()+1);
			User user = UserLogin.getUser(request);
			List<String> list = model.getUrlList();
			if(!Validator.isEmpty(list)){
				if(list.size()>500){
					list.clear();
				}
				list.add(url);
			}
			if(Validator.isEmpty(model.getUser())&&!Validator.isEmpty(user))
			{
				/*
				 * 如果此IP本次刷新前未登录而现在登录后会员数加1
				 */
				MEMBERS++;
				ONLINE_USER_MAP.put(this.onlinekey(user),user);
			}
			else if(!Validator.isEmpty(model.getUser())&&Validator.isEmpty(user))
			{
				/*
				 * 如果此IP本次刷新前已登录而当前未登录则会员数减1
				 */
				ONLINE_USER_MAP.remove(this.onlinekey(user));
				MEMBERS--;
			}
			else if(!Validator.isEmpty(model.getUser())){
				ONLINE_USER_MAP.put(this.onlinekey(user),user);
			}
			model.setUser(user);
			ONLINE_MAP.put(ip,model);
		}
	}

	private String onlinekey(User user){
		if(Validator.isEmpty(user)){
			return null;
		}else{
			return "Online:userId="+user.getUserId();
		}
	}
	
	private static BasicInfoService getBasicInfoService() {
		return ServiceWrapper.<BasicInfoService>getSingletonInstance(ServiceLocator.BASICINFO);
	}
	
	private IPLockService getIPLockService() {
		return ServiceWrapper.<IPLockService>getSingletonInstance(ServiceLocator.IPLOCK);
	}

	public int getUsers() {
		if(USERS<0){
			USERS=0;
		}
		return USERS;
	}

	public int getMembers() {
		if(MEMBERS<0){
			MEMBERS = 0;
		}
		return MEMBERS;
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?