得到client真IP住址
1、引进的必要性log4j-1.2.14.jar
package org.ydd.test; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; /**
* @author coco
* @version
* 获取IP4
*/
public class IP4 {
private static final Logger log = Logger.getLogger(IP4.class);
/**
* 获取client真实IP地址(注意:假设通过Squid反向代理软件。需更改squid.conf配置文件forwarded_for项默认是为on。
* 否则获取到的IP为unknown)
* @param request
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static String getIpAddr(HttpServletRequest request) {
log.debug("===================================================="); if(log.isDebugEnabled()){
StringBuffer buf = new StringBuffer("all head info:\n");
Enumeration enumeration = request.getHeaderNames();
while(enumeration.hasMoreElements()){
Object head = enumeration.nextElement();
if(null != head){
String value = request.getHeader(String.valueOf(head));
buf.append(head + "=" + value + "\n");
}
}
log.debug(buf.toString());
} String ip = request.getHeader("x-forwarded-for");
log.debug("request.getHeader(\"x-forwarded-for\")=" + ip); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Forwarded-For");
log.debug("request.getHeader(\"X-Forwarded-For\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
log.debug("request.getHeader(\"Proxy-Client-IP\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
log.debug("request.getHeader(\"WL-Proxy-Client-IP\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
log.debug("request.getHeader(\"HTTP_CLIENT_IP\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
log.debug("request.getHeader(\"HTTP_X_FORWARDED_FOR\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
log.debug("request.getRemoteAddr()=" + ip);
} if(null != ip && ip.indexOf(',') != -1){
//假设通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串 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
//注意:当訪问地址为 localhost 时 地址格式为 0:0:0:0:0:0:1
log.debug("ip=" + ip);
String[] ips = ip.split(",");
for (int i = 0; i < ips.length; i++) {
if(null != ips[i] && !"unknown".equalsIgnoreCase(ips[i])){
ip = ips[i];
break;
}
}
if("0:0:0:0:0:0:1".equals(ip)){
log.warn("因为client訪问地址使用 localhost,获取client真实IP地址错误,请使用IP方式訪问");
}
} if("unknown".equalsIgnoreCase(ip)){
log.warn("因为client通过Squid反向代理软件訪问,获取client真实IP地址错误,请更改squid.conf配置文件forwarded_for项默认是为on解决");
}
log.debug("====================================================");
return ip;
}
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
得到client真IP住址的更多相关文章
- Get the client's IP address in socket.io
From: https://www.wentong.org/codex/question-2018081564702.html When using socket.IO in a Node.js se ...
- 拿到手机ip住址
转载自:http://blog.csdn.net/showhilllee/article/details/8746114 貌似ASI里获取ip地址的链接不能够了.也曾试过whatismyip,在其站点 ...
- 13 于C#如何获得在IP住址
首先,需要加入一个命名空间 using System.Net.NetworkInformation; using System.Net.Sockets; 以下是具体代码 GetPrivateIP(); ...
- 如何在 Koa 中获取 client 的 ip 以及 port
ctx.body.remoteAddress ctx.body.remotePort
- server端获得到client端的IP地址的格式
使用telnet,ping或其他client连接server端时,server端获得的client端的ip地址取决于client端使用的时ipv4还是ipv6地址. 例: client IPv4地址: ...
- TCP/IP详解 (转)
TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中 ...
- QEMU-KVM自己主动创建虚拟机,以指定IP构造
正在使用qemu不能指定创建虚拟机的过程IP住址,然而,在实际应用中,我们需要有一台虚拟机IP住址,不是人为的虚拟机操作系统配置. 于qemu虚拟机技术文档(http://qemu.weilnetz. ...
- java得到clientIP地址和MAC住址
最近的项目应该得到client的mac住址. 服务器移植centos制,arm建筑箱.client手机和移动设备.(其他方案也应该是一流的似的) 首先,要获得ip住址: 依据client的http请求 ...
- ROCKETMQ源码分析笔记2:client
CLIENT 之前讲过tools里面有大量调用client的东西.为了从源码层面了解rocket,决定啃下client这块骨头. pom 先看pom,看看CLIENT依赖谁.看完后原来是依赖commo ...
随机推荐
- Catalog和Schema
http://www.codeweblog.com/database-schema-and-catalog/ http://blog.sina.com.cn/s/blog_515015800100et ...
- 用U盘装win7/XP系统的操作
现在上网本越来越流行了,但是上网本是没有光驱的,那如何给上网本装系统就成了一个难题,其实不仅仅不带光驱的笔记本用户愁怎么装系统,那些没有光驱的台式机用户也愁.为了给这类用户提供方便,笔者今天以上网本装 ...
- 【OpenGL游戏开发之二】OpenGL常用API
OpenGL常用API 开发基于OpenGL的应用程序,必须先了解OpenGL的库函数.它采用C语言风格,提供大量的函数来进行图形的处理和显示.OpenGL库函数的命名方式非常有规律.所有OpenGL ...
- Ubuntu-升级linux软件源,安装vim/五笔
重装linux后 软件都没了. 这些是要做的: (1):升级软件源 sudo gedit /etc/apt/source.list 打开后ctrl c 下面的源 ##网易的源(163源,无论是不是教 ...
- [置顶] Mysql存储过程入门知识
Mysql存储过程入门知识 #1,查看数据库所有的存储过程名 #--这个语句被用来移除一个存储程序.不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 #SELECT NAME FROM ...
- 分布式拒绝服务攻击(DDoS)原理及防范【转】
DDoS攻击概念 DoS的攻击方式有很多种,最基本的DoS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应. DDoS攻击手段是在传统的DoS攻击基础之上产生的一类攻击 ...
- oralce DBA 培训_lesson06
控制文件 -小型二进制文件 -定义物理数据库的当前状态 -丢失控制文件须要修复 -维护数据库的完整性 -要求: 1.在启动数据库时处于mount状态 2.可以操作数据库 -仅仅链接至一个数据库 -最初 ...
- 【Apache ZooKeeper】为ZNode设置watcher
众所周知,ZooKeeper中的ZNode是树形结构,现在我需要给/app1结点设置watcher,监听/app1下增减.删除和修改的结点,并将相应的事件使用log4j记录到日志文件中.ZNode的变 ...
- Android 常用代码大集合 [转]
[Android]调用字符串资源的几种方法 字符串资源的定义 文件路径:res/values/strings.xml 字符串资源定义示例: <?xml version="1.0&q ...
- JAVA责任链设计模式
<JAVA与模式>之责任链模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模 ...