• 实现步骤如下

(1)新建一个java web工程

(2)新建servers包,新建类GetRequestIp,用来处理获取请求IP,GetRequestIp类完整代码如下:

package servers;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class GetRequestIp {
public static void post(HttpServletRequest request, HttpServletResponse response) { getIpAddress(request);
} public static String getIpAddress(HttpServletRequest request) { String ip = null;
ip = request.getHeader("x-forwarded-for");
System.out.println("x-forwarded-for:" + ip); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Forwarded-For");
System.out.println("request.getHeader(\"X-Forwarded-For\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
System.out.println("request.getHeader(\"Proxy-Client-IP\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
System.out.println("request.getHeader(\"WL-Proxy-Client-IP\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
System.out.println("request.getHeader(\"HTTP_CLIENT_IP\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
System.out.println("request.getHeader(\"HTTP_X_FORWARDED_FOR\")=" + ip);
} if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
System.out.println("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
System.out.println("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))
{
System.out.println("由于客户端访问地址使用 localhost,获取客户端真实IP地址错误,请使用IP方式访问");
}
} if("unknown".equalsIgnoreCase(ip))
{
System.out.println("由于客户端通过Squid反向代理软件访问,获取客户端真实IP地址错误,请更改squid.conf配置文件forwarded_for项默认是为on解决");
} return ip;
}
}

(3)新建一个JSP页面,命名为MyRequest.jsp,完整代码如下:

<%@ page import="servers.GetRequestIp" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%> <%
out.clear();
out = pageContext.pushBody();
GetRequestIp.post(request, response);
%>

(4)运行,开启tomcat,在浏览器输入网址:http://127.0.0.1:8085/MyDemo/MyRequest.jsp,查看输出结果。

  • 附:获取客户端IP地址时,使用不同代理时三个HTTP请求头的区别

   (learn from:http://www.cnblogs.com/technic-emotion/articles/3701257.html

  一、没有使用代理服务器的情况:

  • REMOTE_ADDR = 您的 IP
  • HTTP_VIA = 没数值或不显示
  • HTTP_X_FORWARDED_FOR = 没数值或不显示

  二、使用透明代理服务器的情况:Transparent Proxies

  • REMOTE_ADDR = 最后一个代理服务器 IP
  • HTTP_VIA = 代理服务器 IP
  • HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

  这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

  三、使用普通匿名代理服务器的情况:Anonymous Proxies

  • REMOTE_ADDR = 最后一个代理服务器 IP
  • HTTP_VIA = 代理服务器 IP
  • HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

  此种情况,隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

  四、使用欺骗性代理服务器的情况:Distorting Proxies

  • REMOTE_ADDR = 代理服务器 IP
  • HTTP_VIA = 代理服务器 IP
  • HTTP_X_FORWARDED_FOR = 随机的 IP,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

  告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

  五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)

  • REMOTE_ADDR = 代理服务器 IP
  • HTTP_VIA = 没数值或不显示
  • HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

  完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

javaweb -- 获取请求IP(附实现源码)的更多相关文章

  1. WebService跨域配置、Ajax跨域请求、附开发过程源码

    项目开发过程中需要和其他公司的数据对接,当时我们公司提供的是WebService,本地测试,都是好的,Ajax跨域请求,就报错,配置WebService过程中,花了不少功夫,入不少坑,不过最终问题还是 ...

  2. 转:微信开发之使用java获取签名signature(贴源码,附工程)

    微信开发之使用java获取签名signature(贴源码,附工程) 标签: 微信signature获取签名 2015-12-29 22:15 6954人阅读 评论(3) 收藏 举报  分类: 微信开发 ...

  3. JavaWeb 获取请求网络协议、IP、端口号、项目根路径

      JavaWeb 获取请求网络协议.IP.端口号.项目根路径 CreateTime--2018年6月1日16点32分 Author:Marydon 1.需求 在项目中,需要使用Java向本程序发送r ...

  4. Asp.net MVC集成Google Calendar API(附Demo源码)

    Asp.net MVC集成Google Calendar API(附Demo源码) Google Calendar是非常方便的日程管理应用,很多人都非常熟悉.Google的应用在国内不稳定,但是在国外 ...

  5. 微信公众平台开发-access_token获取及应用(含源码)

    微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 很多系统中都有access_token参数,对于微信公众平台的access_to ...

  6. 微信公众平台开发2-access_token获取及应用(含源码)

    微信公众平台开发-access_token获取及应用(含源码) 很多系统中都有access_token参数,对于微信公众平台的access_token参数,微信服务器判断该公众平台所拥有的权限,允许或 ...

  7. 用Assert(断言)封装异常,让代码更优雅(附项目源码)

    有关Assert断言大家并不陌生,我们在做单元测试的时候,看业务事务复合预期,我们可以通过断言来校验,断言常用的方法如下: public class Assert { /** * 结果 = 预期 则正 ...

  8. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

  9. Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

    Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...

随机推荐

  1. CAS 4.0.0RC 配置MD5验证功能

    配置内容同一样,只是增加一些配置. 因为cas已经默认就支持MD5加密验证,所以只是修改一下配置就可以了. <bean id="primaryAuthenticationHandler ...

  2. Android 适配2

    Android AutoLayout全新的适配方式 堪称适配终结者 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/4999094 ...

  3. python easy_install pip django

    1. install python (2.7.8) 2. set PATH, add python27 3. python easy_install.py 4. easy_install pip 5. ...

  4. (转C#中Enum用法小结)

    enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存储. (1)默认情况下,枚举中的第一个变量被赋值为0,其他的变量的值按定义的顺序来递增(0,12,3...),因此以下 ...

  5. Spring声明式事务管理基于@Transactional注解

    概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解.         第一种方式我已在上文为大 ...

  6. PAT/进制转换习题集

    B1022. D进制的A+B (20) Description: 输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数. Input: ...

  7. 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)

    一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...

  8. PC远程调试移动设备

    我们在移动端进行前端开发时,会遇到一个让人头痛但不得不面对的问题——调试. 在 PC 机器上,我们有功能强大的 Chrome DevTools.Firebug,即便是老版本的 IE ,我们也可以安装微 ...

  9. Unity3D热更新全书-下载 唯一的一篇

    下载在这个时代实在是太平常了,每个人都深刻的理解着下载到底是什么. 这一篇文字只是把下载的代码分享并介绍,而已. 首先,下载系统担负着几个使命. 第一.是保持客户端版本库的最新. 第二.是下载要能够比 ...

  10. 根据Excel的内容和word模板生成对应的word文档

    Sub setname() Dim I As Integer Dim pspname As String Dim pspnumber As String Dim path As String Dim ...