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. flume 一对多hdfs_10PB 规模的 HDFS 数据在 eBay 的迁移实战
  2. 矩形窗函数的频谱图_读书笔记6-单频矩形脉冲信号
  3. PHP GD压缩图片
  4. XML文档中的xmlns、xmlns:xsi和xsi:schemaLocation
  5. .NET Oject And Json
  6. 华南师范大学计算机考研考场,2018考研:华南师范大学考场安排
  7. Java实现部标JTT1078实时音视频传输指令——视频流负载包(RTP)传输
  8. java根据word模板生成word文档_根据Word模板生成Word文件 (JAVA POI)
  9. win10未安装任何音频输出设备解决方案-记一次电脑的睿智问题
  10. skywalking 安装部署以及监控远程应用
  11. oracle vitu,Podnikové servery | Oracle Česká Republika
  12. oss视频转码处理(解决部分浏览器无法正常播放问题)
  13. 一加7t人脸识别_一加7T深度测评:它体现了最佳的技术价值吗?
  14. 985毕业,半路出家28岁进军Java,坚持三年如今年薪36W+,我是这么做的...
  15. 拓展kmp(2020新年第一篇博客 学无止境冲啊)
  16. LINUX KALI初级渗透XP系统入门学习总结(一)
  17. 春晚 “北帝” “东邪”
  18. 城市交通指挥与应急疏导广播系统方案
  19. 2021年智能制造工程设计与应用类赛项:离散行业自动化方向(2)-项目方案设计书
  20. Android Gesture 手势研究

热门文章

  1. 单片机如何实现大数据的串口传输_获客成本日益增加,企业如何实现大数据精准获客?...
  2. java自动化测试报告_Java自动化测试框架-10 - TestNG之测试结果篇(详细教程)
  3. 2020华南理工计算机考研分数线,华南理工大学2020考研复试分数线已公布
  4. 异常检测-LocalOutlierFactor的理解与应用
  5. Kaggle比赛源代码和讨论的收集整理
  6. mysql移植海思_minigui在海思解决方案(hi3515芯片)上的移植过程(转)
  7. 易语言 设置屏幕刷新率 源码_一块好的手机屏幕应具备什么条件?现在了解还不晚...
  8. QT如何让窗口放置在屏幕正中间
  9. 【项目管理】认识项目相关方(干系人)管理
  10. Vue中实现页面上点击按钮下载文件(exe)