我们在做项目的时候经常需要获取客户端的真实ip去进行判断,为此搜索了相关文章,以下这个讲解的比较明白,直接拿来

https://blog.csdn.net/yin_jw/article/details/24470131

在Servlet里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid,Nginx等反向代理软件就不能获取到客户端的真实IP地址了。

如果使用了反向代理软件,例如将http://192.168.101.88:80/ 的URL反向代理为http://pay.kedou.com/ 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或192.168.101.88,而并不是客户端的真实IP。

如下图,原来是client端直接请求服务端,走A路线请求,这时候通过request.getRemoteAddr()方法可以准备的获取客户端的IP。但是做了代理之后呢,client端不是直接请求服务端,而是走B线路请求代理服务器,由代理器去请求服务端,这时候服务端通过request.getRemoteAddr()方法拿到的理所当然是代理服务器的地址了。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的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的Java类:

[java] view plain copy

 
 
  1. /**
  2. * 常用获取客户端信息的工具
  3. *
  4. */
  5. public final class NetworkUtil {
  6. /**
  7. * Logger for this class
  8. */
  9. private static Logger logger = Logger.getLogger(RandomCodeUtils.class);
  10. /**
  11. * 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;
  12. *
  13. * @param request
  14. * @return
  15. * @throws IOException
  16. */
  17. public final static String getIpAddress(HttpServletRequest request) throws IOException {
  18. // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
  19. String ip = request.getHeader("X-Forwarded-For");
  20. if (logger.isInfoEnabled()) {
  21. logger.info("getIpAddress(HttpServletRequest) - X-Forwarded-For - String ip=" + ip);
  22. }
  23. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  24. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  25. ip = request.getHeader("Proxy-Client-IP");
  26. if (logger.isInfoEnabled()) {
  27. logger.info("getIpAddress(HttpServletRequest) - Proxy-Client-IP - String ip=" + ip);
  28. }
  29. }
  30. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  31. ip = request.getHeader("WL-Proxy-Client-IP");
  32. if (logger.isInfoEnabled()) {
  33. logger.info("getIpAddress(HttpServletRequest) - WL-Proxy-Client-IP - String ip=" + ip);
  34. }
  35. }
  36. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  37. ip = request.getHeader("HTTP_CLIENT_IP");
  38. if (logger.isInfoEnabled()) {
  39. logger.info("getIpAddress(HttpServletRequest) - HTTP_CLIENT_IP - String ip=" + ip);
  40. }
  41. }
  42. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  43. ip = request.getHeader("HTTP_X_FORWARDED_FOR");
  44. if (logger.isInfoEnabled()) {
  45. logger.info("getIpAddress(HttpServletRequest) - HTTP_X_FORWARDED_FOR - String ip=" + ip);
  46. }
  47. }
  48. if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
  49. ip = request.getRemoteAddr();
  50. if (logger.isInfoEnabled()) {
  51. logger.info("getIpAddress(HttpServletRequest) - getRemoteAddr - String ip=" + ip);
  52. }
  53. }
  54. } else if (ip.length() > 15) {
  55. String[] ips = ip.split(",");
  56. for (int index = 0; index < ips.length; index++) {
  57. String strIp = (String) ips[index];
  58. if (!("unknown".equalsIgnoreCase(strIp))) {
  59. ip = strIp;
  60. break;
  61. }
  62. }
  63. }
  64. return ip;
  65. }
  66. }

通过Request获取客户端的真实IP的更多相关文章

  1. java代码获取客户端的真实ip

    java代码获取客户端的真实ip protected String getIpAddr(HttpServletRequest request) { String ip = request.getHea ...

  2. 获取客户端用户真实ip方法整理(jekyll迁移)

    layout: post title: 获取客户端用户真实ip方法整理 date: 2019-08-22 author: xiepl1997 tags: springboot 由请求获取客户端ip地址 ...

  3. 通过HttpservletRequest对象获取客户端的真实IP地址

    这篇文章主要介绍了Java中使用HttpRequest获取用户真实IP地址,使用本文方法可以避免Apache.Squid.nginx等反向代理软件导致的非真实IP地址,需要的朋友可以参考下 在JSP里 ...

  4. 使用request获取访问者的真实IP

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  5. PHP获取客户端的真实IP

    REMOTE_ADDR只能获取访问者本地连接中设置的IP,如中南民族大学校园网中自己设置的10.X.XXX.XXX系列IP,而这个函数获取的是局域网网关出口的IP地址, 如果访问者使用代理服务器,将不 ...

  6. php 获取客户端的真实ip地址 通过第三方网站

    <?php include 'simple_html_dom.php'; // 1获取真实IP地址方式 function get_onlineip() { $ch = curl_init('ht ...

  7. 获取客户端访问真实 IP

    转载自:https://www.qikqiak.com/post/get-client-realip/ 通常,当集群内的客户端连接到服务的时候,是支持服务的 Pod 可以获取到客户端的 IP 地址的, ...

  8. 服务器受到网络攻击时,如何获取请求客户端的真实 IP?

    网络攻击 前不久公司遭受了一次网络攻击. 早晨刚到公司,就发现登录接口的调用次数飙升,很快就确认是被恶意攻击,让安全部门做网关入口针对对方 IP 加了限制. 并统一对所有的 IP 加了调用的频率限制. ...

  9. 根据Request获取客户端IP 内网IP及外网IP

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实 ...

随机推荐

  1. php 实现店铺装修4

    /** * @title 发布装修的店铺 * @example FlagShipShopDecorate.fabu? 调试参数:{"username":"17721355 ...

  2. IOS UIPanGestureRecognizer手势使用及识别状态UIGestureRecognizerState

    UIGestureRecognizerState -- 手势识别器状态 1.先来看官方文档 定义UIGestureRecognizer.h 英文: typedef NS_ENUM(NSInteger, ...

  3. NLP之gensim

    一. 利用 jieba 进行分词,关键词提取 利用gensim下面的corpora,models,similarities 进行语料库建立,模型tfidf算法,稀疏矩阵相似度分析 # -*- codi ...

  4. php二位数组排序(按子元素排序)

    array_multisort(array_column($mainTree[$note]["beCalls"], "wtp"), SORT_DESC, arr ...

  5. R 《回归分析与线性统计模型》page121,4.4

    rm(list = ls()) A = read.xlsx("xiti_4.xlsx",sheet = 4) names(A) = c("ord"," ...

  6. [转]Android 如何建立AIDL

    建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下: (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件.该文件的语法类似于Java代码,但会稍有不同.详 ...

  7. 强大的promise

    这个玩意叫做普罗米修斯,希腊神话的盗火英雄 promise只用来包装异步函数,同步的会搞乱执行顺序,生产BUG // 如何使用 function pro(){ return new Promise(f ...

  8. 013-PHP输出表格

    <?php // 数据表格化 print("<TABLE bgcolor='ffccoo' BORDER=\"1\">\n"); // 表格开 ...

  9. 拓扑排序--P2881 [USACO07MAR]排名的牛Ranking the Cows

    *传送 FJ想按照奶牛产奶的能力给她们排序.现在已知有N头奶牛(1 ≤ N ≤ 1,000).FJ通过比较,已经知道了M(1 ≤ M ≤ 10,000)对相对关系.每一对关系表示为“X Y”,意指X的 ...

  10. Quartz 调用

    讲解 在线Cron表达式 调用(DLL下载) static void Main(string[] args) { //1.任务调度调用 //开启任务,操作数据,然后将数据广播给指定用户 //Cron表 ...