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

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

/**
* The Class IpUtils.
*
*/
public abstract class IpUtils {

/**
* Gets the client ip addr.
*
* @param request the request
* @return the client ip addr
*/
public static String getClientIpAddr(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.getRemoteAddr();
}
return ip;
}

/**
* Gets the real ips.
*
* @return the real ips
*/
public static List<String> getRealIps() {
List<String> ips = new ArrayList<String>();
String localip = null;// 本地IP,如果没有配置外网IP则返回它
String netip = null;// 外网IP
Enumeration<NetworkInterface> netInterfaces;
try {
netInterfaces = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
return null;
}
InetAddress ip = null;
boolean finded = false;// 是否找到外网IP
while (netInterfaces.hasMoreElements() && !finded) {
NetworkInterface ni = netInterfaces.nextElement();
Enumeration<InetAddress> address = ni.getInetAddresses();
while (address.hasMoreElements()) {
ip = address.nextElement();
if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 外网IP
netip = ip.getHostAddress();
ips.add(netip);
finded = true;
break;
} else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 内网IP
localip = ip.getHostAddress();
ips.add(localip);
}
}
}
return ips;
}

/**
* Gets the real ip.
*
* @return the real ip
*/
public static String getRealIp() {
return getRealIps().iterator().next();
}
}

时间: 2024-07-28 21:22:17

根据Request获取客户端IP 内网IP及外网IP的相关文章

〖Network〗宿舍配置两路由器,同时访问校园内网和校园外网

环境: 校园宿舍, 10.x.x.x 和 172.16.x.x~172.31.x.x是校园内网,本科教务系统什么的都在上边 路由器: 路由器1(校园内网):水星MR807 路由器2(拨号上网):TP Link WR740R 达成目标: 宿舍成员通过路由器2正常访问校园外网,同时,可以正常访问校园内网. 操作步骤: 一.配置路由器1(校园内网) 1. 修改路由器地址从192.168.1.1到192.168.1.2: 登录192.168.1.1 -- 网络配置 -- LAN -- IP地址 -- 输

linux内网机器访问外网代理设置

1.检查机器 在操作中发现访问外网的机器本身不能使用yum 安装软件,故需要配置yum安装源.如果可以的,这步可忽略. [[email protected] test]# lsb_release -a LSB Version:    :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing-4.

判断访问者是内网访问还是外网访问

//域登录  判断是内网还是外网请求 public function regip($ip){ $ip = ip2long($ip); $net_a = ip2long('10.255.255.255') >> 24; //A类网预留ip的网络地址 $net_b = ip2long('172.31.255.255') >> 20; //B类网预留ip的网络地址 $net_c = ip2long('192.168.255.255') >> 16; //C类网预留ip的网络地

内网服务器无外网上网 &&端口映射

一内网上网 环境说明: 主机A: 1.宿主上网机器 eth0:10.0.0.8   #作为外网地址 eth1:172.16.1.8   #内网地址 外网网卡信息: [[email protected] ~]# cat  /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=none IPADDR=10.0.0.8 NETMASK=255.

内网主机通过外网地址访问内网服务器

网关设备一般都具有NAT功能,分别为源地址NAT.目标地址NAT,这两种功能应用比较普遍,各厂商都有很标准的实现方式.但是对于"内网主机通过外网地址访问内网服务器"这一场景,各厂商的实现不通,下面就这个场景,分别说一下各厂商的实现.1.华为2.华三内网用户通过NAT地址访问内网服务器1组网需求 · 某公司内部网络中有一台FTP服务器,地址为192.168.1.4/24. · 该公司拥有两个外网IP地址:202.38.1.1和202.38.1.2. 需要实现如下功能: · 外网主机可以通

如何简单使用ngrok,将网站内网映射到外网

由于最近实验室的需要,需要对每个网站制作demo版本进行展示(区分于正式版本),就准备使用ngrok进行内网映射到外网. Google一番后发现国外的ngrok.com没办法访问,苦苦寻找后发现了一个国内的站点:http://www.ngrok.cc/ 直接下载win 64位版本的. 下载解压后,文件夹中包含了ngrok.exe和ngrok.cfg两个文件 同时保证本地的服务器已经启动.如图本地我开启了tomcat服务器 18080端口. 这时我们通过cmd 到达下载好的ngrok目录.(如果直

把内网映射到外网的步骤教程

内网映射到外网的工具 ngrok可以将内网映射到公网,这样就可以访问本地的网络服务 用法: 打开自己电脑的cmd 一.ngrok 8080 本地Tomcat的端口号. 二.输入ngrok -config ngrok.cfg -subdomain example 8080(国内域名)(example  可以根据自己的变)[国内] 可以参考帮助文档 : http://www.tunnel.moi/ ngrok.cfg 官网文档上下载 放到 ngrok里面

根据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 ,而并不是客户

【C#】C#获取本地的内网(局域网)和外网(公网)IP地址的方法

1.获取本机的IP地址集合: 1 /// <summary> 2 /// 获取本机所有ip地址 3 /// </summary> 4 /// <param name="netType">"InterNetwork":ipv4地址,"InterNetworkV6":ipv6地址</param> 5 /// <returns>ip地址集合</returns> 6 public s