-
-
Save Y-k-Y/5c54fe151f54196df26a3af916ee08d6 to your computer and use it in GitHub Desktop.
How to get full client info using servlet request, including client IP, browser, os, use-agent and referer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@RequiredArgsConstructor | |
public class HttpClientUtil { | |
private final HttpServletRequest request; | |
private final String[] HEADERS_TO_TRY_TO_GET_IP = { | |
"X-Forwarded-For", | |
"Proxy-Client-IP", | |
"WL-Proxy-Client-IP", | |
"HTTP_X_FORWARDED_FOR", | |
"HTTP_X_FORWARDED", | |
"HTTP_X_CLUSTER_CLIENT_IP", | |
"HTTP_CLIENT_IP", | |
"HTTP_FORWARDED_FOR", | |
"HTTP_FORWARDED", | |
"HTTP_VIA", | |
"REMOTE_ADDR"}; | |
public String getClientIpAddress() { | |
for (String header : HEADERS_TO_TRY_TO_GET_IP) { | |
String ip = request.getHeader(header); | |
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { | |
return ip; | |
} | |
} | |
return request.getRemoteAddr(); | |
} | |
public String getReferer() { | |
return request.getHeader("referer"); | |
} | |
public String getUserAgent() { | |
return request.getHeader("User-Agent"); | |
} | |
public String getFullUrl() { | |
final StringBuffer requestUrl = request.getRequestURL(); | |
final String queryString = request.getQueryString(); | |
return queryString == null ? request.toString() : requestUrl.append('?') | |
.append(queryString) | |
.toString(); | |
} | |
public String getClientOs() { | |
final String[] OS = {"windows", "mac", "x11", "android", "iphone"}; | |
final String userAgent = getUserAgent(); | |
final String lowerCaseUA = userAgent.toLowerCase(); | |
for (String os : OS) { | |
if (lowerCaseUA.contains(os)) { | |
if(os.equals("x11")) return "Unix"; | |
if(os.equals("mac") && lowerCaseUA.contains("iphone")) return "IOS"; | |
return os.substring(0, 1).toUpperCase().concat(os.substring(1)); | |
} | |
} | |
return "Unknown"; | |
} | |
public String getClientBrowser() { | |
final String userAgent = getUserAgent(); | |
final String lowerCaseUA = userAgent.toLowerCase(); | |
String browser = ""; | |
if (lowerCaseUA.contains("mise")) { | |
String substring = userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0]; | |
browser = substring.split(" ")[0].replace("MSIE", "IE") + "-" + substring.split(" ")[1]; | |
} else if (lowerCaseUA.contains("safari") && lowerCaseUA.contains("version") && !lowerCaseUA.contains("naver")) { | |
browser = (userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]) | |
.split("/")[0] + "-" + (userAgent.substring(userAgent.indexOf("Version")) | |
.split(" ")[0]) | |
.split("/")[1]; | |
} else if (lowerCaseUA.contains("opr") || lowerCaseUA.contains("opera")) { | |
if (lowerCaseUA.contains("opera")) { | |
browser = (userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]) | |
.split("/")[0] + "-" + (userAgent.substring(userAgent.indexOf("Version")) | |
.split(" ")[0]) | |
.split("/")[1]; | |
} else if (lowerCaseUA.contains("opr")) { | |
browser = ((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]) | |
.replace("/", "-")) | |
.replace("OPR", "opera"); | |
} | |
} else if (lowerCaseUA.contains("chrome")) { | |
browser = (userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-"); | |
} else if ( | |
(lowerCaseUA.contains("mozilla/7.0")) || | |
(lowerCaseUA.contains("netscape6")) || | |
(lowerCaseUA.contains("mozilla/4.7")) || | |
(lowerCaseUA.contains("mozilla/4.78")) || | |
(lowerCaseUA.contains("mozilla/4.08")) || | |
(lowerCaseUA.contains("mozilla/3")) | |
) { | |
browser = "Netscape-?"; | |
} else if (lowerCaseUA.contains("firefox") || lowerCaseUA.contains("fx")) { | |
if(userAgent.contains("Fx")) { | |
browser = (userAgent.substring(userAgent.indexOf("Fx")).split(" ")[0]).replace("/", "-"); | |
} else { | |
browser = (userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-"); | |
} | |
} else if (lowerCaseUA.contains("rv")) { | |
browser = "IE"; | |
} else if (lowerCaseUA.contains("crios")) { | |
browser = (userAgent.substring(userAgent.indexOf("Cr")).split(" ")[0]).replace("/", "-"); | |
} else if (lowerCaseUA.contains("naver")) { | |
browser = "Naver"; | |
} else if (lowerCaseUA.contains("kakaotalk")) { | |
browser = "KakaoTalk"; | |
} else if (lowerCaseUA.contains("whale")) { | |
browser = (userAgent.substring(userAgent.indexOf("Whale")).split(" ")[0]).replace("/", "-"); | |
} else { | |
browser = "Unknown"; | |
} | |
return browser; | |
} | |
public String getDevice() { | |
final String[] MOBILE = { | |
"android; mobile;", | |
"mobile safari", | |
"opera mobi", | |
"iemobile", | |
"iphone; cpu iphone", | |
}; | |
final String userAgent = getUserAgent(); | |
final String lowerCaseUA = userAgent.toLowerCase(); | |
for(String mobile: MOBILE) { | |
if(lowerCaseUA.contains(mobile)) return "Mobile"; | |
} | |
return "Desktop"; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment