getRemoteAddr()和getRemoteHost() 区别
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() 区别相关推荐
- java域对象_javaWeb域对象
JavaWeb有ServletContext.ServletRequest.HttpSession.PageContext四大域对象,下面主要从域对象的生命周期.作用.作用范围进行介绍. Servle ...
- Web答辩问题整合一
Web答辩问题整合1 1. css和div 开发的优势? A.显示和内容实现分离 B.有利于搜索引擎搜索 C.有利于维护和程序的扩展 2. 谈谈页面间的参数传递有哪些方式 ? A.通过作用域对象ses ...
- JSP九大内置对象...
原文地址:http://blog.sina.com.cn/s/blog_6267d71d0100pryr.html JSP九大内置对象: 1.Request, 2.Response,3.Out,4.S ...
- HttpServletRequest简述
HttpServletRequest简述 HttpServletRequest httpServletRequest = (HttpServletRequest) request;/*getReque ...
- Severlet、Cookie、Session 和 Filter 详解
一.Servlet 简介 Servlet(Server Applet),全称 Java Servlet,未有中文译文. Servlet 是用 Java 编写的服务器端程序,其主要功能在于处理请求和发送 ...
- request.getRemoteAddr()和request.getRemoteHost()
转自:https://www.cnblogs.com/aizj/p/7593209.html request.getRemoteAddr()是获得客户端的ip地址. request.getRemote ...
- getRemoteAddr和getLocalAddr的区别
关于获取ip地址为什么获取到的IP地址是0:0:0:0:0:0:0:1 我用了两种方法,获取到的结果是一样的 第一种: logInfoVo.setLoginip(WebUtils.getHttpSer ...
- ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段...
原文地址:ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段 ServletRequest 基本概念 ...
- request.getParameter() 和request.getAttribute() 区别
request.getParameter() 和request.getAttribute() 区别 getParameter 是用来接受用post个get方法传递过来的参数的. getAttribut ...
最新文章
- flume 一对多hdfs_10PB 规模的 HDFS 数据在 eBay 的迁移实战
- 矩形窗函数的频谱图_读书笔记6-单频矩形脉冲信号
- PHP GD压缩图片
- XML文档中的xmlns、xmlns:xsi和xsi:schemaLocation
- .NET Oject And Json
- 华南师范大学计算机考研考场,2018考研:华南师范大学考场安排
- Java实现部标JTT1078实时音视频传输指令——视频流负载包(RTP)传输
- java根据word模板生成word文档_根据Word模板生成Word文件 (JAVA POI)
- win10未安装任何音频输出设备解决方案-记一次电脑的睿智问题
- skywalking 安装部署以及监控远程应用
- oracle vitu,Podnikové servery | Oracle Česká Republika
- oss视频转码处理(解决部分浏览器无法正常播放问题)
- 一加7t人脸识别_一加7T深度测评:它体现了最佳的技术价值吗?
- 985毕业,半路出家28岁进军Java,坚持三年如今年薪36W+,我是这么做的...
- 拓展kmp(2020新年第一篇博客 学无止境冲啊)
- LINUX KALI初级渗透XP系统入门学习总结(一)
- 春晚 “北帝” “东邪”
- 城市交通指挥与应急疏导广播系统方案
- 2021年智能制造工程设计与应用类赛项:离散行业自动化方向(2)-项目方案设计书
- Android Gesture 手势研究
热门文章
- 单片机如何实现大数据的串口传输_获客成本日益增加,企业如何实现大数据精准获客?...
- java自动化测试报告_Java自动化测试框架-10 - TestNG之测试结果篇(详细教程)
- 2020华南理工计算机考研分数线,华南理工大学2020考研复试分数线已公布
- 异常检测-LocalOutlierFactor的理解与应用
- Kaggle比赛源代码和讨论的收集整理
- mysql移植海思_minigui在海思解决方案(hi3515芯片)上的移植过程(转)
- 易语言 设置屏幕刷新率 源码_一块好的手机屏幕应具备什么条件?现在了解还不晚...
- QT如何让窗口放置在屏幕正中间
- 【项目管理】认识项目相关方(干系人)管理
- Vue中实现页面上点击按钮下载文件(exe)