在javase环境中,jersey+grizzly2技术中 中如何获取客户端ip地址?在线等。。
取决于你的应用服务器 grizzly2是否有前端web服务器, 如nginx, 有的话要处理代理头.
如nginx,可能有如下设置
proxy_set_header X-Forwarded-For $remote_addr;
对于ipv4, 可以这样搞
public static boolean isLocalOrUnknow(String ipaddress) {
return ipaddress == null || ipaddress.length() == 0
|| "unknown".equalsIgnoreCase(ipaddress)
|| ipaddress.equals("127.0.0.1")
|| ipaddress.startsWith("192.168.")
|| ipaddress.startsWith("172.16.")
|| ipaddress.startsWith("172.17.")
|| ipaddress.startsWith("172.18.")
|| ipaddress.startsWith("172.19.")
|| ipaddress.startsWith("10.");
}
private static boolean isUnknow(String ipaddress) {
return ipaddress == null || ipaddress.length() == 0
|| "unknown".equalsIgnoreCase(ipaddress)
|| ipaddress.equals("127.0.0.1");
}
public static String getClientIP(HttpServletRequest request) {
String ipaddress = null;// request.getHeader("HTTP_X_FORWARDED_FOR");
// Enumeration e = request.getHeaderNames();
// while(e.hasMoreElements()){
// Object s = e.nextElement();
// System.out.println("HEADER: "+s+"="+request.getHeader(s.toString()));
// }
if (isLocalOrUnknow(ipaddress)) {
ipaddress = request.getHeader("X-Real-IP");
if (isLocalOrUnknow(ipaddress)) {
ipaddress = request.getHeader("Proxy-Client-IP");
if (isLocalOrUnknow(ipaddress)) {
ipaddress = request.getHeader("WL-Proxy-Client-IP");
if (isLocalOrUnknow(ipaddress)) {
ipaddress = request.getHeader("HTTP_CLIENT_IP");
if (isLocalOrUnknow(ipaddress)) {
ipaddress = request.getHeader("X-Forwarded-For");
if (isLocalOrUnknow(ipaddress)) {
ipaddress = request
.getHeader("X-Originating-IP");
if (isLocalOrUnknow(ipaddress)) {
ipaddress = request
.getHeader("HTTP_REMOTE_ADDR");
}
if (isUnknow(ipaddress)) {
ipaddress = request
.getHeader("REMOTE_ADDR");
}
}
}
}
}
}
}
if (isUnknow(ipaddress)) {
ipaddress = request.getRemoteAddr();
}
return ipaddress;
}
@GET
@Path("/yourservice")
@Produces("text/xml")
public String activate(@Context HttpServletRequest requestContext,@Context SecurityContext context){
String ipAddressRequestCameFrom = requestContext.getRemoteAddr();
//Also if security is enabled
Principal principal = context.getUserPrincipal();
String userName = principal.getName();
}