• 实现步骤如下

(1)新建一个java web工程

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

  1. package servers;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5.  
  6. public class GetRequestIp {
  7. public static void post(HttpServletRequest request, HttpServletResponse response) {
  8.  
  9. getIpAddress(request);
  10. }
  11.  
  12. public static String getIpAddress(HttpServletRequest request) {
  13.  
  14. String ip = null;
  15. ip = request.getHeader("x-forwarded-for");
  16. System.out.println("x-forwarded-for:" + ip);
  17.  
  18. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  19. ip = request.getHeader("X-Forwarded-For");
  20. System.out.println("request.getHeader(\"X-Forwarded-For\")=" + ip);
  21. }
  22.  
  23. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  24. ip = request.getHeader("Proxy-Client-IP");
  25. System.out.println("request.getHeader(\"Proxy-Client-IP\")=" + ip);
  26. }
  27.  
  28. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  29. ip = request.getHeader("WL-Proxy-Client-IP");
  30. System.out.println("request.getHeader(\"WL-Proxy-Client-IP\")=" + ip);
  31. }
  32.  
  33. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  34. ip = request.getHeader("HTTP_CLIENT_IP");
  35. System.out.println("request.getHeader(\"HTTP_CLIENT_IP\")=" + ip);
  36. }
  37.  
  38. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  39. ip = request.getHeader("HTTP_X_FORWARDED_FOR");
  40. System.out.println("request.getHeader(\"HTTP_X_FORWARDED_FOR\")=" + ip);
  41. }
  42.  
  43. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  44. ip = request.getRemoteAddr();
  45. System.out.println("request.getRemoteAddr()=" + ip);
  46. }
  47.  
  48. if(null != ip && ip.indexOf(',') != -1)
  49. {
  50. //如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串 IP 值
  51. //取X-Forwarded-For中第一个非unknown的有效IP字符串
  52. //如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
  53. //用户真实IP为: 192.168.1.110
  54. //注意:当访问地址为 localhost 时 地址格式为 0:0:0:0:0:0:1
  55. System.out.println("ip=" + ip);
  56. String[] ips = ip.split(",");
  57. for (int i = 0; i < ips.length; i++)
  58. {
  59. if(null != ips[i] && !"unknown".equalsIgnoreCase(ips[i]))
  60. {
  61. ip = ips[i];
  62. break;
  63. }
  64. }
  65. if("0:0:0:0:0:0:1".equals(ip))
  66. {
  67. System.out.println("由于客户端访问地址使用 localhost,获取客户端真实IP地址错误,请使用IP方式访问");
  68. }
  69. }
  70.  
  71. if("unknown".equalsIgnoreCase(ip))
  72. {
  73. System.out.println("由于客户端通过Squid反向代理软件访问,获取客户端真实IP地址错误,请更改squid.conf配置文件forwarded_for项默认是为on解决");
  74. }
  75.  
  76. return ip;
  77. }
  78. }

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

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

(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. SHELL实现同时操作多个服务器:服务器批量管理

    引言:     1.如果你想知道你所管理的几万台服务器的/home分区使用率是多少.     2.如果你想为你所管理的几万台服务器添加同一个计划任务你该怎么办?     3.如果你想让你所管理的几万台 ...

  2. Texture2D.GetPixelBilinear(float u, float v)的使用,官方例子注释

    using UnityEngine; using System.Collections; public class TEST : MonoBehaviour { public Texture2D so ...

  3. 初入liunx的一些基本的知识

    本系列的博客来自于:http://www.92csz.com/study/linux/ 在此,感谢原作者提供的入门知识 这个系列的博客的目的在于将比较常用的liunx命令从作者的文章中摘录下来,供自己 ...

  4. Xml文件并发读写的解决方法

    之前对xml的操作大都是通过XmlDocument对象来进行,但是这样的情况对于没有并发的是非常合适的,最近遇到了并发读写xml文件的情况.通过文件流来操作能解决大部分的并发情况,对于极端的情况会有问 ...

  5. ng2-timesheet, 一个timesheet.js的angular2复制版

    一个 timesheet.js (JavaScript library for HTML5 & CSS3 time sheets) 的 Angular 2 复制版 用法: npm instal ...

  6. Yii2中的环境配置

    默认的Debug配置 在入口文件中 defined ( 'YII_DEBUG' ) or define ( 'YII_DEBUG', true ); defined ( 'YII_ENV' ) or ...

  7. 说说WeakReference弱引用

    WeakReference弱引用概述 http://www.cnblogs.com/xrq730/p/4836700.html,关于Java的四种引用状态具体请参看此文 Java里一个对象obj被创建 ...

  8. Dojo动画原理解析

    dojo中动画部分分为两部分:dojo/_base/fx, dojo/fx.dojo/_base/fx部分是dojo动画的基石,里面有两个底层API:animateProperty.anim和两个常用 ...

  9. TypeScript - Classes

    简介 JavaScript语言基于函数和原型链继承机制的方式构建可重用的组件.这对于OO方面编程来说显得比较笨拙.在下一代的JavaScript标准ECMAScript 6为我们提供了基于class ...

  10. python 实现web框架simfish

    python 实现web框架simfish 本文主要记录本人利用python实现web框架simfish的过程.源码github地址:simfish WSGI HTTP Server wsgi模块提供 ...