System.out.println("request.getRemoteAddr(): " + request.getRemoteAddr());
System.out.println("request.getRemoteHost(): " + request.getRemoteHost());

得到的结果相同(局域网内试验的结果)。
那么getRemoteAddr()和getRemoteHost()到底有什么区别?
我的目的就是要得到发出request的机器的IP地址,到底用以上哪个方法?
---------------------------------------------------------------

前一个是获得客户端的ip地址
后一个是获得客户端的主机名
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为http://www.xxx.com/ 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的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地址的方法一:

public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}

可是当我访问http://www.xxx.com/index.jsp/ 时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我访问http://192.168.1.110:2046/index.jsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squid.conf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off  则:X-Forwarded-For: unknown

于是可得出获得客户端真实IP地址的方法二:

public String getIpAddr(HttpServletRequest request) {   String ip = request.getHeader("x-forwarded-for");   if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      ip = request.getHeader("Proxy-Client-IP");   }   if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      ip = request.getHeader("WL-Proxy-Client-IP");       }   if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      ip = request.getRemoteAddr();   }   return ip;} 
 

  可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值,究竟哪个才是真正的用户端的真实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

转载于:https://www.cnblogs.com/xiaoliu66007/p/10244627.html

getRemoteAddr()和getRemoteHost() 区别相关推荐

  1. java域对象_javaWeb域对象

    JavaWeb有ServletContext.ServletRequest.HttpSession.PageContext四大域对象,下面主要从域对象的生命周期.作用.作用范围进行介绍. Servle ...

  2. Web答辩问题整合一

    Web答辩问题整合1 1. css和div 开发的优势? A.显示和内容实现分离 B.有利于搜索引擎搜索 C.有利于维护和程序的扩展 2. 谈谈页面间的参数传递有哪些方式 ? A.通过作用域对象ses ...

  3. JSP九大内置对象...

    原文地址:http://blog.sina.com.cn/s/blog_6267d71d0100pryr.html JSP九大内置对象: 1.Request, 2.Response,3.Out,4.S ...

  4. HttpServletRequest简述

    HttpServletRequest简述 HttpServletRequest httpServletRequest = (HttpServletRequest) request;/*getReque ...

  5. Severlet、Cookie、Session 和 Filter 详解

    一.Servlet 简介 Servlet(Server Applet),全称 Java Servlet,未有中文译文. Servlet 是用 Java 编写的服务器端程序,其主要功能在于处理请求和发送 ...

  6. request.getRemoteAddr()和request.getRemoteHost()

    转自:https://www.cnblogs.com/aizj/p/7593209.html request.getRemoteAddr()是获得客户端的ip地址. request.getRemote ...

  7. getRemoteAddr和getLocalAddr的区别

    关于获取ip地址为什么获取到的IP地址是0:0:0:0:0:0:0:1 我用了两种方法,获取到的结果是一样的 第一种: logInfoVo.setLoginip(WebUtils.getHttpSer ...

  8. ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段...

    原文地址:ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段 ServletRequest 基本概念 ...

  9. request.getParameter() 和request.getAttribute() 区别

    request.getParameter() 和request.getAttribute() 区别 getParameter 是用来接受用post个get方法传递过来的参数的. getAttribut ...

最新文章

  1. OpenCV2和3的下载、安装和配置
  2. XML与Web数据挖掘
  3. java拆分数据查相等_scikit learn:train_test_split,我可以确保在不同的数据集上进行相同的拆分...
  4. 使用Seq2Seq+attention实现简单的Chatbot
  5. LeetCode刷题(25)
  6. 预定义类型未定义或导入_LimeSurvey基础教程(二)——问题类型
  7. 故障转移群集 SQLSERVER解决方案
  8. 链表实现直接选择排序
  9. stata抓取html,Stata 网页表格爬取示例
  10. 基于SSM开发的的小区物业管理系统小程序源码
  11. 2021年系统架构设计师考试上午真题与答案
  12. 不用工具直接从微软官网下载Win10正式版ISO镜像的技巧
  13. mixamo_Mixamo的动画商店插件现在支持Mecanim!
  14. 第一篇,怎么增加SYN数据包的大小(syn flood攻击实验)
  15. 苏州银行信息技术面试
  16. HTML5 CSS3 生日快乐动画网页(粉红色的回忆)
  17. UNIX TIMESTAMP 与 TIME 之间的转换
  18. 二、数据集与数据类型【R与统计】
  19. 记一次 .NET 某制造业 MES 系统崩溃分析
  20. Labview图像视觉处理——VDM、VAS的下载安装

热门文章

  1. disconf mysql_disconf浅入浅出(一)disconf简介以及disconf-web端使用
  2. mysql 备份库的shell_MySQL数据库的shell脚本自动备份
  3. adxl276怎么添加到proteus中_奶粉中的营养强化剂和食品添加剂是怎么一回事?
  4. android关机菜单修改,Android4.4关机菜单添加重启系列选项
  5. 电子白板技术_电子白板种类介绍及产品功能概述
  6. 最好电脑操作系统_软件开发人员该如何选择笔记本电脑?朋克老师来教你
  7. dropout的正则化理解
  8. 傅里叶变换的初级理解三
  9. 行星轨迹制作_FLASH做的八大行星的轨道图的教学
  10. cr3格式怎么转换成jpg_怎么把JPG格式转换为PDF?