/**
* Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved.
* EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* http://www.ewcms.com
*/
package com.ewcms.plugin.visit.util;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ewcms.common.lang.EmptyUtil;
/**
*
* @author wuzhijun
*
*/
public class VisitUtil {
private static final Logger logger = LoggerFactory.getLogger(VisitUtil.class);
private static Object mutex = new Object();
private static String langCodeArr[];
private static String langNameArr[];
private static int TRANSACTION_ID_LENGTH = 32;
private static char cs[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();
private static int FIRFOX_VERSION = 30;
private static int MSIE_VERSION = 30;
public final static String UNLOAD_EVENT = "Unload";
/**
* 域名
*
* @param url
* URL地址
* @return String
*/
public static String getDomain(String url) {
int index1 = url.indexOf("//") + 2;
int index2 = url.indexOf("/", index1 + 2);
if (index2 == -1)
index2 = url.length();
return url.substring(index1, index2).toLowerCase();
}
/**
* 转换IP
*
* @param ip
* IP
* @return Long
*/
public static long convertIP(String ip) {
try {
String array[] = splitEx(ip, ".");
long t = (Long.parseLong(array[0]) * 16777216L
+ Long.parseLong(array[1]) * 65536L
+ Long.parseLong(array[2]) * 256L
+ Long.parseLong(array[3])) - 1L;
return t;
} catch (Exception e) {
logger.warn("错误的IP地址:" + ip);
}
return 0L;
}
private static String[] splitEx (String str, String spilter) {
if (str == null) {
return null;
}
if ((spilter == null) || (spilter.equals(""))
|| (str.length() < spilter.length())) {
String[] t = { str };
return t;
}
ArrayList<String> al = new ArrayList<String>();
char[] cs = str.toCharArray();
char[] ss = spilter.toCharArray();
int length = spilter.length();
int lastIndex = 0;
for (int i = 0; i <= str.length() - length;) {
boolean notSuit = false;
for (int j = 0; j < length; j++) {
if (cs[(i + j)] != ss[j]) {
notSuit = true;
break;
}
}
if (!notSuit) {
al.add(str.substring(lastIndex, i));
i += length;
lastIndex = i;
} else {
i++;
}
}
if (lastIndex <= str.length()) {
al.add(str.substring(lastIndex, str.length()));
}
String[] t = new String[al.size()];
for (int i = 0; i < al.size(); i++) {
t[i] = ((String) al.get(i));
}
return t;
}
/**
* 操作系统
*
* @param useragent
* @return
*/
public static String getOS(String useragent) {
if (EmptyUtil.isNull(useragent))
return "其他";
if (useragent.indexOf("Windows NT 6.1") > 0)
return "Windows 7";
if (useragent.indexOf("Windows NT 6.0") > 0)
return "Windows Vista";
if (useragent.indexOf("Windows NT 5.2") > 0)
return "Windows 2003";
if (useragent.indexOf("Windows NT 5.1") > 0)
return "Windows XP";
if (useragent.indexOf("Windows NT 5.0") > 0)
return "Windows 2000";
if (useragent.indexOf("Windows NT") > 0)
return "Windows NT";
if (useragent.indexOf("Windows 9") > 0
|| useragent.indexOf("Windows 4") > 0)
return "Windows 9x";
if (useragent.indexOf("Unix") > 0 || useragent.indexOf("SunOS") > 0
|| useragent.indexOf("BSD") > 0)
return "Unix";
if (useragent.indexOf("Linux") > 0)
return "Linux";
if (useragent.indexOf("Mac") > 0)
return "Mac";
if (useragent.indexOf("Windows CE") > 0)
return "Windows CE";
if (useragent.indexOf("iPhone") > 0)
return "iPhone";
if (useragent.indexOf("BlackBerry") > 0)
return "BlackBerry";
if (useragent.indexOf("SymbianOS") > 0
|| useragent.indexOf("Series") > 0)
return "Symbian";
else
return "其他";
}
/**
* 语言
*
* @param lang
* @return
*/
public static String getLanguage(String lang) {
if (langCodeArr == null)
synchronized (mutex) {
if (langCodeArr == null) {
Map<String, String> map = new HashMap<String, String>();
map.put("en_us", "英文(美国)");
map.put("ar", "阿拉伯文");
map.put("ar_ae", "阿拉伯文(阿拉伯联合酋长国)");
map.put("ar_bh", "阿拉伯文(巴林)");
map.put("ar_dz", "阿拉伯文(阿尔及利亚)");
map.put("ar_eg", "阿拉伯文(埃及)");
map.put("ar_iq", "阿拉伯文(伊拉克)");
map.put("ar_jo", "阿拉伯文(约旦)");
map.put("ar_kw", "阿拉伯文(科威特)");
map.put("ar_lb", "阿拉伯文(黎巴嫩)");
map.put("ar_ly", "阿拉伯文(利比亚)");
map.put("ar_ma", "阿拉伯文(摩洛哥)");
map.put("ar_om", "阿拉伯文(阿曼)");
map.put("ar_qa", "阿拉伯文(卡塔尔)");
map.put("ar_sa", "阿拉伯文(沙特阿拉伯)");
map.put("ar_sd", "阿拉伯文(苏丹)");
map.put("ar_sy", "阿拉伯文(叙利亚)");
map.put("ar_tn", "阿拉伯文(突尼斯)");
map.put("ar_ye", "阿拉伯文(也门)");
map.put("be", "白俄罗斯文");
map.put("be_by", "白俄罗斯文(白俄罗斯)");
map.put("bg", "保加利亚文");
map.put("bg_bg", "保加利亚文(保加利亚)");
map.put("ca", "加泰罗尼亚文");
map.put("ca_es", "加泰罗尼亚文(西班牙)");
map.put("ca_es_euro", "加泰罗尼亚文(西班牙,Euro)");
map.put("cs", "捷克文");
map.put("cs_cz", "捷克文(捷克共和国)");
map.put("da", "丹麦文");
map.put("da_dk", "丹麦文(丹麦)");
map.put("de", "德文");
map.put("de_at", "德文(奥地利)");
map.put("de_at_euro", "德文(奥地利,Euro)");
map.put("de_ch", "德文(瑞士)");
map.put("de_de", "德文(德国)");
map.put("de_de_euro", "德文(德国,Euro)");
map.put("de_lu", "德文(卢森堡)");
map.put("de_lu_euro", "德文(卢森堡,Euro)");
map.put("el", "希腊文");
map.put("el_gr", "希腊文(希腊)");
map.put("en_au", "英文(澳大利亚)");
map.put("en_ca", "英文(加拿大)");
map.put("en_gb", "英文(英国)");
map.put("en_ie", "英文(爱尔兰)");
map.put("en_ie_euro", "英文(爱尔兰,Euro)");
map.put("en_nz", "英文(新西兰)");
map.put("en_za", "英文(南非)");
map.put("es", "西班牙文");
map.put("es_bo", "西班牙文(玻利维亚)");
map.put("es_ar", "西班牙文(阿根廷)");
map.put("es_cl", "西班牙文(智利)");
map.put("es_co", "西班牙文(哥伦比亚)");
map.put("es_cr", "西班牙文(哥斯达黎加)");
map.put("es_do", "西班牙文(多米尼加共和国)");
map.put("es_ec", "西班牙文(厄瓜多尔)");
map.put("es_es", "西班牙文(西班牙)");
map.put("es_es_euro", "西班牙文(西班牙,Euro)");
map.put("es_gt", "西班牙文(危地马拉)");
map.put("es_hn", "西班牙文(洪都拉斯)");
map.put("es_mx", "西班牙文(墨西哥)");
map.put("es_ni", "西班牙文(尼加拉瓜)");
map.put("es_pa", "西班牙文(巴拿马)");
map.put("es_pe", "西班牙文(秘鲁)");
map.put("es_pr", "西班牙文(波多黎哥)");
map.put("es_py", "西班牙文(巴拉圭)");
map.put("es_sv", "西班牙文(萨尔瓦多)");
map.put("es_uy", "西班牙文(乌拉圭)");
map.put("es_ve", "西班牙文(委内瑞拉)");
map.put("et", "爱沙尼亚文");
map.put("et_ee", "爱沙尼亚文(爱沙尼亚)");
map.put("fi", "芬兰文");
map.put("fi_fi", "芬兰文(芬兰)");
map.put("fi_fi_euro", "芬兰文(芬兰,Euro)");
map.put("fr", "法文");
map.put("fr_be", "法文(比利时)");
map.put("fr_be_euro", "法文(比利时,Euro)");
map.put("fr_ca", "法文(加拿大)");
map.put("fr_ch", "法文(瑞士)");
map.put("fr_fr", "法文(法国)");
map.put("fr_fr_euro", "法文(法国,Euro)");
map.put("fr_lu", "法文(卢森堡)");
map.put("fr_lu_euro", "法文(卢森堡,Euro)");
map.put("hr", "克罗地亚文");
map.put("hr_hr", "克罗地亚文(克罗地亚)");
map.put("hu", "匈牙利文");
map.put("hu_hu", "匈牙利文(匈牙利)");
map.put("is", "冰岛文");
map.put("is_is", "冰岛文(冰岛)");
map.put("it", "意大利文");
map.put("it_ch", "意大利文(瑞士)");
map.put("it_it", "意大利文(意大利)");
map.put("it_it_euro", "意大利文(意大利,Euro)");
map.put("iw", "希伯来文");
map.put("iw_il", "希伯来文(以色列)");
map.put("ja", "日文");
map.put("ja_jp", "日文(日本)");
map.put("ko", "朝鲜文");
map.put("ko_kr", "朝鲜文(南朝鲜)");
map.put("lt", "立陶宛文");
map.put("lt_lt", "立陶宛文(立陶宛)");
map.put("lv", "拉托维亚文(列托)");
map.put("lv_lv", "拉托维亚文(列托)(拉脱维亚)");
map.put("mk", "马其顿文");
map.put("mk_mk", "马其顿文(马其顿王国)");
map.put("nl", "荷兰文");
map.put("nl_be", "荷兰文(比利时)");
map.put("nl_be_euro", "荷兰文(比利时,Euro)");
map.put("nl_nl", "荷兰文(荷兰)");
map.put("nl_nl_euro", "荷兰文(荷兰,Euro)");
map.put("no", "挪威文");
map.put("no_no", "挪威文(挪威)");
map.put("no_no_ny", "挪威文(挪威,Nynorsk)");
map.put("pl", "波兰文");
map.put("pl_pl", "波兰文(波兰)");
map.put("pt", "葡萄牙文");
map.put("pt_br", "葡萄牙文(巴西)");
map.put("pt_pt", "葡萄牙文(葡萄牙)");
map.put("pt_pt_euro", "葡萄牙文(葡萄牙,Euro)");
map.put("ro", "罗马尼亚文");
map.put("ro_ro", "罗马尼亚文(罗马尼亚)");
map.put("ru", "俄文");
map.put("ru_ru", "俄文(俄罗斯)");
map.put("sh", "塞波尼斯-克罗地亚文");
map.put("sh_yu", "塞波尼斯-克罗地亚文(南斯拉夫)");
map.put("sk", "斯洛伐克文");
map.put("sk_sk", "斯洛伐克文(斯洛伐克)");
map.put("sl", "斯洛文尼亚文");
map.put("sl_si", "斯洛文尼亚文(斯洛文尼亚)");
map.put("sq", "阿尔巴尼亚文");
map.put("sq_al", "阿尔巴尼亚文(阿尔巴尼亚)");
map.put("sr", "塞尔维亚文");
map.put("sr_yu", "塞尔维亚文(南斯拉夫)");
map.put("sv", "瑞典文");
map.put("sv_se", "瑞典文(瑞典)");
map.put("th", "泰文");
map.put("th_th", "泰文(泰国)");
map.put("tr", "土耳其文");
map.put("tr_tr", "土耳其文(土耳其)");
map.put("uk", "乌克兰文");
map.put("uk_ua", "乌克兰文(乌克兰)");
map.put("zh", "中文");
map.put("zh_cn", "中文(大陆)");
map.put("zh_hk", "中文(香港)");
map.put("zh_tw", "中文(台湾)");
map.put("zh_sg", "中文(新加坡)");
map.put("en-us", "英文(美国)");
map.put("ar-ae", "阿拉伯文(阿拉伯联合酋长国)");
map.put("ar-bh", "阿拉伯文(巴林)");
map.put("ar-dz", "阿拉伯文(阿尔及利亚)");
map.put("ar-eg", "阿拉伯文(埃及)");
map.put("ar-iq", "阿拉伯文(伊拉克)");
map.put("ar-jo", "阿拉伯文(约旦)");
map.put("ar-kw", "阿拉伯文(科威特)");
map.put("ar-lb", "阿拉伯文(黎巴嫩)");
map.put("ar-ly", "阿拉伯文(利比亚)");
map.put("ar-ma", "阿拉伯文(摩洛哥)");
map.put("ar-om", "阿拉伯文(阿曼)");
map.put("ar-qa", "阿拉伯文(卡塔尔)");
map.put("ar-sa", "阿拉伯文(沙特阿拉伯)");
map.put("ar-sd", "阿拉伯文(苏丹)");
map.put("ar-sy", "阿拉伯文(叙利亚)");
map.put("ar-tn", "阿拉伯文(突尼斯)");
map.put("ar-ye", "阿拉伯文(也门)");
map.put("be-by", "白俄罗斯文(白俄罗斯)");
map.put("bg-bg", "保加利亚文(保加利亚)");
map.put("ca-es", "加泰罗尼亚文(西班牙)");
map.put("ca-es-euro", "加泰罗尼亚文(西班牙西班牙,Euro)");
map.put("cs-cz", "捷克文(捷克共和国)");
map.put("da-dk", "丹麦文(丹麦)");
map.put("de-at", "德文(奥地利)");
map.put("de-at-euro", "德文(奥地利,Euro)");
map.put("de-ch", "德文(瑞士)");
map.put("de-de", "德文(德国)");
map.put("de-de-euro", "德文(德国,Euro)");
map.put("de-lu", "德文(卢森堡)");
map.put("de-lu-euro", "德文(卢森堡,Euro)");
map.put("el-gr", "希腊文(希腊)");
map.put("en-au", "英文(澳大利亚)");
map.put("en-ca", "英文(加拿大)");
map.put("en-gb", "英文(英国)");
map.put("en-ie", "英文(爱尔兰)");
map.put("en-ie-euro", "英文(爱尔兰,Euro)");
map.put("en-nz", "英文(新西兰新西兰)");
map.put("en-za", "英文(南非)");
map.put("es-bo", "西班牙文(玻利维亚)");
map.put("es-ar", "西班牙文(阿根廷)");
map.put("es-cl", "西班牙文(智利)");
map.put("es-co", "西班牙文(哥伦比亚)");
map.put("es-cr", "西班牙文(哥斯达黎加)");
map.put("es-do", "西班牙文(多米尼加共和国)");
map.put("es-ec", "西班牙文(厄瓜多尔)");
map.put("es-es", "西班牙文(西班牙)");
map.put("es-es-euro", "西班牙文(西班牙,Euro)");
map.put("es-gt", "西班牙文(危地马拉)");
map.put("es-hn", "西班牙文(洪都拉斯)");
map.put("es-mx", "西班牙文(墨西哥)");
map.put("es-ni", "西班牙文(尼加拉瓜)");
map.put("es-pa", "西班牙文(巴拿马)");
map.put("es-pe", "西班牙文(秘鲁)");
map.put("es-pr", "西班牙文(波多黎哥)");
map.put("es-py", "西班牙文(巴拉圭)");
map.put("es-sv", "西班牙文(萨尔瓦多)");
map.put("es-uy", "西班牙文(乌拉圭)");
map.put("es-ve", "西班牙文(委内瑞拉)");
map.put("et-ee", "爱沙尼亚文(爱沙尼亚)");
map.put("fi-fi", "芬兰文(芬兰)");
map.put("fi-fi-euro", "芬兰文(芬兰,Euro)");
map.put("fr-be", "法文(比利时)");
map.put("fr-be-euro", "法文(比利时,Euro)");
map.put("fr-ca", "法文(加拿大)");
map.put("fr-ch", "法文(瑞士)");
map.put("fr-fr", "法文(法国)");
map.put("fr-fr-euro", "法文(法国,Euro)");
map.put("fr-lu", "法文(卢森堡)");
map.put("fr-lu-euro", "法文(卢森堡,Euro)");
map.put("hr-hr", "克罗地亚文(克罗地亚)");
map.put("hu-hu", "匈牙利文(匈牙利)");
map.put("is-is", "冰岛文(冰岛)");
map.put("it-ch", "意大利文(瑞士)");
map.put("it-it", "意大利文(意大利)");
map.put("it-it-euro", "意大利文(意大利,Euro)");
map.put("iw-il", "希伯来文(以色列)");
map.put("ja-jp", "日文(日本)");
map.put("ko-kr", "朝鲜文(南朝鲜)");
map.put("lt-lt", "立陶宛文(立陶宛)");
map.put("lv-lv", "拉托维亚文(列托)(拉脱维亚)");
map.put("mk-mk", "马其顿文(马其顿王国)");
map.put("nl-be", "荷兰文(比利时)");
map.put("nl-be-euro", "荷兰文(比利时,Euro)");
map.put("nl-nl", "荷兰文(荷兰)");
map.put("nl-nl-euro", "荷兰文(荷兰,Euro)");
map.put("no-no", "挪威文(挪威)");
map.put("no-no-ny", "挪威文(挪威,Nynorsk)");
map.put("pl-pl", "波兰文(波兰)");
map.put("pt-br", "葡萄牙文(巴西)");
map.put("pt-pt", "葡萄牙文(葡萄牙)");
map.put("pt-pt-euro", "葡萄牙文(葡萄牙,Euro)");
map.put("ro-ro", "罗马尼亚文(罗马尼亚)");
map.put("ru-ru", "俄文(俄罗斯)");
map.put("sh-yu", "塞波尼斯-克罗地亚文(南斯拉夫)");
map.put("sk-sk", "斯洛伐克文(斯洛伐克)");
map.put("sl-si", "斯洛文尼亚文(斯洛文尼亚)");
map.put("sq-al", "阿尔巴尼亚文(阿尔巴尼亚)");
map.put("sr-yu", "塞尔维亚文(南斯拉夫)");
map.put("sv-se", "瑞典文(瑞典)");
map.put("th-th", "泰文(泰国)");
map.put("tr-tr", "土耳其文(土耳其)");
map.put("uk-ua", "乌克兰文(乌克兰)");
map.put("zh-cn", "中文(大陆)");
map.put("zh-hk", "中文(香港)");
map.put("zh-tw", "中文(台湾)");
map.put("zh-sg", "中文(新加坡)");
Object ks[] = map.keySet().toArray();
Object vs[] = map.values().toArray();
String arr[] = new String[ks.length];
langNameArr = new String[ks.length];
for (int i = 0; i < map.size(); i++) {
arr[i] = ks[i].toString();
langNameArr[i] = vs[i].toString();
}
langCodeArr = arr;
}
}
if (EmptyUtil.isNull(lang))
return "其他";
lang = lang.trim();
for (int i = 0; i < langCodeArr.length; i++)
if (lang.equalsIgnoreCase(langCodeArr[i]))
return langNameArr[i];
return "其他";
}
/**
* 分辩率
*
* @param screen
* @return
*/
public static String getScreen(String screen) {
if (screen == null)
return "其他";
if (!screen.equals("1024x768") && !screen.equals("1280x800")
&& !screen.equals("1440x900") && !screen.equals("1366x768")
&& !screen.equals("1280x1024") && !screen.equals("1280x768")
&& !screen.equals("1152x864") && !screen.equals("1600x900")
&& !screen.equals("1680x1050") && !screen.equals("800x600")
&& !screen.equals("1280x960") && !screen.equals("1920x1080")
&& !screen.equals("1280x720"))
return "其他";
else
return screen;
}
/**
* 浏览器
*
* @param useragent
* @return
*/
public static String getBrowser(String useragent) {
String browser = "其他";
if (useragent.indexOf("Netscape") > 0)
browser = "Netscape";
else if (useragent.indexOf("Firefox") > 0){
for (int i = FIRFOX_VERSION; i > 0; i--){
if (useragent.indexOf("Firefox/" + i + ".") > 0){
browser = "Firefox " + i;
break;
}
}
}
else if (useragent.indexOf("Safari") > 0)
browser = "Safari";
else if (useragent.indexOf("Opera") > 0)
browser = "Opera";
else if (useragent.indexOf("Chrome") > 0)
return "Chrome";
else if (useragent.indexOf("MSIE") > 0) {
for (int i = MSIE_VERSION; i > 2; i--){
if (useragent.indexOf("MSIE " + i) > 0){
browser = "IE" + i;
}
}
}
return browser;
}
/**
* 获取唯一编号
*
* @return
*/
public static String getUniqueID() {
byte b[] = new byte[TRANSACTION_ID_LENGTH];
SecureRandom sr = new SecureRandom();
sr.nextBytes(b);
return toPrintable(b);
}
public static String getIP(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (EmptyUtil.isNull(ip) || "unknown".equalsIgnoreCase(ip))
ip = request.getHeader("Proxy-Client-IP");
if (EmptyUtil.isNull(ip) || "unknown".equalsIgnoreCase(ip))
ip = request.getHeader("WL-Proxy-Client-IP");
if (EmptyUtil.isNull(ip) || "unknown".equalsIgnoreCase(ip))
ip = request.getHeader("HTTP_CLIENT_IP");
if (EmptyUtil.isNull(ip) || "unknown".equalsIgnoreCase(ip))
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
if (EmptyUtil.isNull(ip) || "unknown".equalsIgnoreCase(ip))
ip = request.getRemoteAddr();
return ip;
}
private static String toPrintable(byte b[]) {
char out[] = new char[b.length];
for (int i = 0; i < b.length; i++) {
int index = b[i] % cs.length;
if (index < 0)
index += cs.length;
out[i] = cs[index];
}
return new String(out);
}
public static String getCookieValue(HttpServletRequest request, String cookieName) {
return getCookieValue(request, cookieName, "");
}
public static String getCookieValue(HttpServletRequest request,
String cookieName, String defaultValue) {
Cookie cookies[] = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie cookie : cookies) {
if (cookieName.equalsIgnoreCase(cookie.getName())) {
try {
return URLDecoder.decode(cookie.getValue(), "UTF-8");
} catch (UnsupportedEncodingException e) {
logger.warn(e.getLocalizedMessage());
return defaultValue;
}
}
}
}
return defaultValue;
}
public static void setCookieValue(HttpServletRequest request,HttpServletResponse response, String cookieName, String cValue) {
setCookieValue(request, response, cookieName, 2678400, cValue);
}
public static void setCookieValue(HttpServletRequest request, HttpServletResponse response, String cookieName, int maxAge, String cValue) {
Cookie cookies[] = request.getCookies();
boolean cookieexistflag = false;
String contextPath = request.getContextPath();
int length = contextPath.length();
if (length > 1){
contextPath = contextPath.substring(0, length - 1);
}
try {
cValue = URLEncoder.encode(cValue, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
for (int i = 0; cookies != null && i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookieName.equalsIgnoreCase(cookie.getName())) {
cookieexistflag = true;
cookie.setValue(cValue);
cookie.setPath(contextPath);
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}
}
if (!cookieexistflag) {
Cookie cookie = new Cookie(cookieName, cValue);
cookie.setPath(contextPath);
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}
}
public static void main(String[] args) {
try{
System.out.println(convertIP("202.101.224.68"));
}catch (Exception e){
}
}
}