Java中使用HttpRequest获取用户真实IP地址

在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid,nginx等反向代理软件就不能获取到客户端的真实IP地址了。

如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.jb51.net / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.jb51.net /index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

package com.rapido.utils; 

import javax.servlet.http.HttpServletRequest; 

/**
 * 自定义访问对象工具类
 *
 * 获取对象的IP地址等信息
 * @author X-rapido
 *
 */
public class CusAccessObjectUtil { 

  /**
   * 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址,
   *
   * 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?
   * 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。
   *
   * 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130,
   * 192.168.1.100
   *
   * 用户真实IP为: 192.168.1.110
   *
   * @param request
   * @return
   */
  public static String getIpAddress(HttpServletRequest request) {
    String ip = request.getHeader("x-forwarded-for");
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      ip = request.getHeader("Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      ip = request.getHeader("HTTP_CLIENT_IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      ip = request.getHeader("HTTP_X_FORWARDED_FOR");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
      ip = request.getRemoteAddr();
    }
    return ip;
  } 

}
(0)

相关推荐

  • Java利用Request请求如何获取IP地址对应的省份、城市详解

    前言 最近的一个项目中需要将不同省份的用户,展示不同内容,所以需要通过Request请求获取IP地址, 然后通过IP获取IP对应省份. 这里的操作步骤一共有步: 1. 通过Request获取IP 2. 通过IP获取对应省份.城市 3. 通过设置的省份和IP对应省份进行比对,展示内容 通过Request获取IP 可以参考我的另外一篇文章[Java 通过Request请求获取IP地址]下面是代码: public class IpAdrressUtil { /** * 获取Ip地址 * @param

  • Java利用Request请求获取IP地址的方法详解

    前言 最近在项目中遇到一个需求,是需要将不同省份的用户,展示不同内容,通过查找相关的资料,发现可以通过Request请求获取IP地址,下面我们先来贴代码, 如果你要在生产环境使用就直接拿去用吧,我这边已经上线了. 示例代码 public class IpAdrressUtil { /** * 获取Ip地址 * @param request * @return */ private static String getIpAdrress(HttpServletRequest request) { S

  • Java根据Request获取客户端IP

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了. 如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为http://www.xxx.com/ 的URL时,用request.getRemoteAddr() 方法获取的IP地址是:127.0.0.1 或 192.168.1.110 ,而并不是客

  • Java中使用HttpRequest获取用户真实IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid,nginx等反向代理软件就不能获取到客户端的真实IP地址了. 如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.jb51.net / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110

  • LNAMP架构中后端Apache获取用户真实IP地址的2种方法

    一.Nginx反向代理配置: 1.虚拟主机配置 复制代码 代码如下: location / {    try_files $uri @apache;} location @apache {internal;    proxy_pass http://127.0.0.1:8080;    include proxy.conf;} location ~ .*\.(php|php5)?$  {    proxy_pass http://127.0.0.1:8080;    include proxy.

  • 基于nginx反向代理获取用户真实Ip地址详解

    目录 引言 1.修改Nginx配置: 2.java获取客户端Ip 附:一个ip工具类 总结 引言 nginx做反向代理时,默认的配置后端获取到的Ip地址都来自于nginx,用request.getRemoteAddr();获取到的是nginx的ip地址,而不是用户的真实ip. 1.修改Nginx配置: server { listen 80; server_name jenkins.local.com; location / { proxy_set_header Host $host; proxy

  • php获取用户真实IP和防刷机制的实例代码

    一. 如何获取用户IP地址 public static function getClientIp() { if (getenv('HTTP_CLIENT_IP')) { $ip = getenv('HTTP_CLIENT_IP'); } if (getenv('HTTP_X_REAL_IP')) { $ip = getenv('HTTP_X_REAL_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR')) { $ip = getenv('HTTP_X_FO

  • Java获取客户端真实IP地址过程解析

    这篇文章主要介绍了Java获取客户端真实IP地址过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 业务背景 服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等拦截,在进行IP限定的时候就需要获取客户端真实的IP. 基础知识 访问服务端的方式一般分为两种: 未经过代理,直接访问服务器端: 通过多级代理,最终到达服务器端(nginx,squid,haproxy). 客户端请求信息都包含在HttpServletRequest中

  • Java获取电脑真实IP地址的示例代码

    /** * @author yins * @date 2018年8月12日下午9:53:58 */ import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; /** * 获取本地真正的IP地址,即获得有线或者无线WiFi地址. * 过滤虚拟机.蓝

  • Nginx反向代理后无法获取客户端真实IP地址

    目录 1.原始配置文件如下 2.配置转发后 当我们使用 Nginx 代理转发服务后,会发现我们无法获取客户端的真实IP地址,从而无法获取客户端的地理位置等信息. 1.原始配置文件如下 worker_processes  1; events {     worker_connections  1024; } http {     include       mime.types;     default_type  application/octet-stream;     sendfile  

  • PHP获取用户访问IP地址的5种方法

    本文实例为大家分享了5种PHP获取用户访问IP地址的方法,供大家参考,具体内容如下 <?php //方法1: $ip = $_SERVER["REMOTE_ADDR"]; echo $ip; //方法2: $user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"]; $user_IP = ($

  • PHP获取客户端真实IP地址的5种情况分析和实现代码

    在PHP获取客户端IP中常使用 $_SERVER["REMOTE_ADDR"] . (1) 但如果客户端是使用代理服务器来访问,那取到的是代理服务器的 IP 地址,而不是真正的客户端 IP 地址.要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取. (2) 但只有客户端使用"透明代理"的情况下,$_SERVER["HTTP_X_FORWARDED_FOR&q

  • JSP如何获取客户端真实IP地址

    在JSP中,获取客户端IP的方法为:request.getRemoteAddr().这种方法在大部分情况下都是有效的,但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了. 如果使用了反向代理软件,将http://192.168.1.110:3306/ 的URL反向代理为http://www.8888.com/ 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实

随机推荐