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 + -
显示快捷键?