Java获取用户ip

简介:

Java 如何获取客户端IP呢? 

核心思想:通过HTTP的request来获取
下面是我总结的几种方法:

Java代码   收藏代码
  1. /** 
  2.      * 获取客户端ip地址(可以穿透代理) 
  3.      *  
  4.      * @param request 
  5.      * @return 
  6.      */  
  7.     public static String getRemoteAddr(HttpServletRequest request) {  
  8.         String ip = request.getHeader("X-Forwarded-For");  
  9.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  10.             ip = request.getHeader("Proxy-Client-IP");  
  11.         }  
  12.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  13.             ip = request.getHeader("WL-Proxy-Client-IP");  
  14.         }  
  15.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  16.             ip = request.getHeader("HTTP_CLIENT_IP");  
  17.         }  
  18.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  19.             ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
  20.         }  
  21.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  22.             ip = request.getRemoteAddr();  
  23.         }  
  24.         return ip;  
  25.     }  
  26.     private static final String[] HEADERS_TO_TRY = {   
  27.         "X-Forwarded-For",  
  28.         "Proxy-Client-IP",  
  29.         "WL-Proxy-Client-IP",  
  30.         "HTTP_X_FORWARDED_FOR",  
  31.         "HTTP_X_FORWARDED",  
  32.         "HTTP_X_CLUSTER_CLIENT_IP",  
  33.         "HTTP_CLIENT_IP",  
  34.         "HTTP_FORWARDED_FOR",  
  35.         "HTTP_FORWARDED",  
  36.         "HTTP_VIA",  
  37.         "REMOTE_ADDR",  
  38.         "X-Real-IP"};  
  39.   
  40.     /*** 
  41.      * 获取客户端ip地址(可以穿透代理) 
  42.      * @param request 
  43.      * @return 
  44.      */  
  45.     public static String getClientIpAddress(HttpServletRequest request) {  
  46.         for (String header : HEADERS_TO_TRY) {  
  47.             String ip = request.getHeader(header);  
  48.             if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {  
  49.                 return ip;  
  50.             }  
  51.         }  
  52.         return request.getRemoteAddr();  
  53.     }  
  54.     /*** 
  55.      * 获取客户端ip地址(可以穿透代理) 
  56.      * @param request 
  57.      * @return 
  58.      */  
  59.     public static String getClientIpAddr(HttpServletRequest request) {    
  60.         String ip = request.getHeader("X-Forwarded-For");    
  61.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  62.             ip = request.getHeader("Proxy-Client-IP");    
  63.         }    
  64.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  65.             ip = request.getHeader("WL-Proxy-Client-IP");    
  66.         }    
  67.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  68.             ip = request.getHeader("HTTP_X_FORWARDED_FOR");    
  69.         }    
  70.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  71.             ip = request.getHeader("HTTP_X_FORWARDED");    
  72.         }    
  73.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  74.             ip = request.getHeader("HTTP_X_CLUSTER_CLIENT_IP");    
  75.         }    
  76.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  77.             ip = request.getHeader("HTTP_CLIENT_IP");    
  78.         }    
  79.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  80.             ip = request.getHeader("HTTP_FORWARDED_FOR");    
  81.         }    
  82.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  83.             ip = request.getHeader("HTTP_FORWARDED");    
  84.         }    
  85.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  86.             ip = request.getHeader("HTTP_VIA");    
  87.         }    
  88.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  89.             ip = request.getHeader("REMOTE_ADDR");    
  90.         }    
  91.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    
  92.             ip = request.getRemoteAddr();    
  93.         }    
  94.         return ip;    
  95.     }  
  96.     public static String getIpAddr(HttpServletRequest request) {  
  97.         String ip = request.getHeader("X-Real-IP");  
  98.         if (null != ip && !"".equals(ip.trim())  
  99.                 && !"unknown".equalsIgnoreCase(ip)) {  
  100.             return ip;  
  101.         }  
  102.         ip = request.getHeader("X-Forwarded-For");  
  103.         if (null != ip && !"".equals(ip.trim())  
  104.                 && !"unknown".equalsIgnoreCase(ip)) {  
  105.             // get first ip from proxy ip  
  106.             int index = ip.indexOf(',');  
  107.             if (index != -1) {  
  108.                 return ip.substring(0, index);  
  109.             } else {  
  110.                 return ip;  
  111.             }  
  112.         }  
  113.         return request.getRemoteAddr();  
  114.     }  

我使用的是spring MVC框架,测试的控制器代码如下: 

Java代码   收藏代码
  1. package com.web.controller;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7.   
  8. import org.springframework.stereotype.Controller;  
  9. import org.springframework.web.bind.annotation.RequestMapping;  
  10. import org.springframework.web.bind.annotation.ResponseBody;  
  11.   
  12. import com.common.util.SystemHWUtil;  
  13. import com.common.util.WebServletUtil;  
  14. import com.string.widget.util.ValueWidget;  
  15. import com.util.JSONPUtil;  
  16. /*** 
  17.  * 用于测试跨域 
  18.  * @author huangweii 
  19.  * 2015年5月29日 
  20.  */  
  21. @Controller  
  22. @RequestMapping("/cors")  
  23. public class CORSController {  
  24.     @ResponseBody  
  25.     @RequestMapping(value = "/simple",produces=SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)  
  26.     public String corsJsonSimple(HttpServletRequest request,String callback){  
  27.         String content;  
  28.         Map map=new HashMap();  
  29.         map.put("username""黄威");  
  30.         map.put("age""27");  
  31.         map.put("address""beijing");  
  32.         content=JSONPUtil.getJsonP(map, callback);  
  33.         System.out.println("getIpAddr:"+WebServletUtil.getIpAddr(request));  
  34.         System.out.println("getRemoteAddr:"+WebServletUtil.getRemoteAddr(request));  
  35.         System.out.println("getClientIpAddr:"+WebServletUtil.getClientIpAddr(request));  
  36.         System.out.println("getClientIpAddress:"+WebServletUtil.getClientIpAddress(request));  
  37.         return content;  
  38.     }  
  39.   
  40. }  

 测试结果: 

 

参考:Java获取用户ip

http://blog.csdn.net/hw1287789687/article/details/46292069

相关文章
|
3月前
|
数据采集 Java API
java怎么设置代理ip:简单步骤,实现高效网络请求
本文介绍了在Java中设置代理IP的方法,包括使用系统属性设置HTTP和HTTPS代理、在URL连接中设置代理、设置身份验证代理,以及使用第三方库如Apache HttpClient进行更复杂的代理配置。这些方法有助于提高网络请求的安全性和灵活性。
110 0
|
7月前
|
Java Redis 数据安全/隐私保护
Redis13的Java客户端-Jedis快速入门,建立连接的写法,ip地址,设置密码密码,选择库的写法
Redis13的Java客户端-Jedis快速入门,建立连接的写法,ip地址,设置密码密码,选择库的写法
|
8月前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
62 3
|
8月前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
62 1
|
8月前
|
数据采集 Java 数据安全/隐私保护
使用Java进行网络采集:代理IP与参数传递详解
Java参数传递是按值传递,包括对象引用的值。当传递对象时,方法内部修改对象内容会影响原始对象,但不能改变原始引用。示例展示了如何在爬虫代理中使用此机制,通过`ProxySettings`类传递代理信息,方法内可访问但不能更改原始对象。理解这一机制对编写高效无错的Java代码至关重要。
使用Java进行网络采集:代理IP与参数传递详解
|
8月前
|
Java Apache Maven
蓝易云 - java判断ip是否为指定网段
在这个例子中,我们首先创建了一个 `SubnetUtils`对象,它表示一个子网。然后,我们使用 `isInRange`方法来检查指定的IP地址是否在这个子网内。如果IP地址在子网内,`isInRange`方法将返回 `true`,否则返回 `false`。
149 3
|
9月前
|
网络协议 Java
Java的Socket编程:TCP/IP与UDP深入探索
Java的Socket编程:TCP/IP与UDP深入探索
132 0
|
9月前
|
存储 Java 定位技术
【Java】根据IP地址获取省市
【Java】根据IP地址获取省市
697 1
|
9月前
|
存储 Java
Java动态转发代理IP的实现方法
Java动态转发代理IP的实现方法
342 11
|
9月前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
169 2

热门文章

最新文章