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住址的更多相关文章

  1. 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 ...

  2. 拿到手机ip住址

    转载自:http://blog.csdn.net/showhilllee/article/details/8746114 貌似ASI里获取ip地址的链接不能够了.也曾试过whatismyip,在其站点 ...

  3. 13 于C#如何获得在IP住址

    首先,需要加入一个命名空间 using System.Net.NetworkInformation; using System.Net.Sockets; 以下是具体代码 GetPrivateIP(); ...

  4. 如何在 Koa 中获取 client 的 ip 以及 port

    ctx.body.remoteAddress ctx.body.remotePort

  5. server端获得到client端的IP地址的格式

    使用telnet,ping或其他client连接server端时,server端获得的client端的ip地址取决于client端使用的时ipv4还是ipv6地址. 例: client IPv4地址: ...

  6. TCP/IP详解 (转)

    TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中 ...

  7. QEMU-KVM自己主动创建虚拟机,以指定IP构造

    正在使用qemu不能指定创建虚拟机的过程IP住址,然而,在实际应用中,我们需要有一台虚拟机IP住址,不是人为的虚拟机操作系统配置. 于qemu虚拟机技术文档(http://qemu.weilnetz. ...

  8. java得到clientIP地址和MAC住址

    最近的项目应该得到client的mac住址. 服务器移植centos制,arm建筑箱.client手机和移动设备.(其他方案也应该是一流的似的) 首先,要获得ip住址: 依据client的http请求 ...

  9. ROCKETMQ源码分析笔记2:client

    CLIENT 之前讲过tools里面有大量调用client的东西.为了从源码层面了解rocket,决定啃下client这块骨头. pom 先看pom,看看CLIENT依赖谁.看完后原来是依赖commo ...

随机推荐

  1. linux学习之(三)-文件操作命令

    创建一个空文件: touch  文件名 例:touch   tom 查看: 查看一个文件的内容命令cat 文件名 例:cat tom   注:cat命令并不能显示文件的所有信息,但屏幕显示的 行数是有 ...

  2. 在magento中使用正则式

    $sqlCondition = "IFNULL(_table_name.value, _table_name_default.value) REGEXP '^[^a-zA-Z]'" ...

  3. 【每天一个Linux命令】13. Linux中whereis命令的用法

      命令用途 whereis命令用来查找命令的位置,包括执行文件.源代码和手册页文件 命令用法 1. 查找指定命令<command>的位置,包括执行文件.源代码和手册页文件 格式:wher ...

  4. ODBC与JDBC比較

    在学习J2EE的JDBC过程中,刚见到JDBC就立即联想到了ODBC,并且我们能够肯定他们之间有必定的关系.開始学它的时候还是认为有点晕,于是就查了非常多资料,与比較熟悉的ODBC进行了比較. 先各自 ...

  5. 如果nginx 中worker_connections 值设置是1024,worker_processes 值设置是4,按反向代理模式下最大连接数的理论计算公式: 最大连接数 = worker_processes * worker_connections/4

    如果nginx 中worker_connections 值设置是1024,worker_processes 值设置是4,按反向代理模式下最大连接数的理论计算公式: 最大连接数 = worker_pro ...

  6. asp.net textbox控件基础

    asp.net有两种控件,一种是html控件,一种是asp控件,在说textbox控件之前,先看看按钮的两个命令oncommand和onclick.每次点击按钮后,都会提交命令,但是程序会首先执行Pa ...

  7. 8种排序算法的C#实现

    排序是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列.排序根据涉及的存储器的不同分为内部排序和外部排序:内部排序是指待排序记录存放在内存进行的排序过程:外部排序是指待排序记录的数 ...

  8. [RabbitMQ]Error: unable to connect to node rabbit@compute1: nodedown(CentOS7.0)

    今天在搭建OpenStack的时候需要安装RabbitMQ,可是使用yum install rabbitmq-server安装之后,按照OpenStack官方提供的文档修改guest用户密码的时候却出 ...

  9. ThinkPHP 的CURD

    1.ThinkPHP 3 读取数据 (重点) 对数据的读取 Read $m=new Model('User'); $m=M('User'); select $arr = $m->select() ...

  10. 混淆篇之原生DOM操作方法小结

    1.0   DOM结构 1.1先来看结构图: 父节点        兄弟节点        当前节点            属性节点            子节点        兄弟节点一般任意一个节 ...