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

相关文章
|
5月前
|
Java
Java 如何根据域名查询对应的ip地址
Java 如何根据域名查询对应的ip地址
268 3
|
1天前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
2天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
2月前
|
网络协议 Java 数据安全/隐私保护
如何使用Java实现基于TCP/IP协议的即时通讯系统
TCP/IP协议是现代计算机网络通信中最常用的协议之一,而即时通讯系统则是当前互联网应用中非常普遍的一种场景。本文将介绍如何使用Java编程语言来实现基于TCP/IP协议的即时通讯系统,包括建立服务端和客户端、发送和接收消息等方面的详细步骤和示例。
|
4月前
|
网络协议 Java 程序员
java网络编程什么是TCP/IP协议栈?
java网络编程什么是TCP/IP协议栈?
32 2
|
4月前
|
网络协议 安全 Java
Java网络编程入门指南:TCP/IP协议与Socket通信
Java网络编程入门指南:TCP/IP协议与Socket通信
55 1
|
5月前
|
Java
java 如何将ip 1.2.3.4 变成1.2.3.0/24
如果你想手动实现而不使用第三方库,你可以按照如下的方式进行。以下是一个手动实现的简单示例: ```java import java.net.InetAddress; import java.net.UnknownHostException; public class IpToCidrConverter { public static void main(String[] args) { String ipAddress = "1.2.3.4"; int subnetPrefixLength = 24; try {
|
7月前
|
Java
编程作业(2) - 编程题 3. ip地址判定(Java)
编程作业(2) - 编程题 3. ip地址判定(Java)
|
8月前
|
Java
Java如何获取请求的ip 地址?
Java如何获取请求的ip 地址
128 0
|
9月前
|
Java Linux Nacos
【Java项目】SpringCloud项目注册到Nacos中心时显示的是内网IP导致不同服务器之间无法互相调用接口的解决并发
【Java项目】SpringCloud项目注册到Nacos中心时显示的是内网IP导致不同服务器之间无法互相调用接口的解决并发
196 0