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 ...
最新文章
- OpenCV2和3的下载、安装和配置
- XML与Web数据挖掘
- java拆分数据查相等_scikit learn:train_test_split,我可以确保在不同的数据集上进行相同的拆分...
- 使用Seq2Seq+attention实现简单的Chatbot
- LeetCode刷题(25)
- 预定义类型未定义或导入_LimeSurvey基础教程(二)——问题类型
- 故障转移群集 SQLSERVER解决方案
- 链表实现直接选择排序
- stata抓取html,Stata 网页表格爬取示例
- 基于SSM开发的的小区物业管理系统小程序源码
- 2021年系统架构设计师考试上午真题与答案
- 不用工具直接从微软官网下载Win10正式版ISO镜像的技巧
- mixamo_Mixamo的动画商店插件现在支持Mecanim!
- 第一篇,怎么增加SYN数据包的大小(syn flood攻击实验)
- 苏州银行信息技术面试
- HTML5 CSS3 生日快乐动画网页(粉红色的回忆)
- UNIX TIMESTAMP 与 TIME 之间的转换
- 二、数据集与数据类型【R与统计】
- 记一次 .NET 某制造业 MES 系统崩溃分析
- Labview图像视觉处理——VDM、VAS的下载安装
热门文章
- disconf mysql_disconf浅入浅出(一)disconf简介以及disconf-web端使用
- mysql 备份库的shell_MySQL数据库的shell脚本自动备份
- adxl276怎么添加到proteus中_奶粉中的营养强化剂和食品添加剂是怎么一回事?
- android关机菜单修改,Android4.4关机菜单添加重启系列选项
- 电子白板技术_电子白板种类介绍及产品功能概述
- 最好电脑操作系统_软件开发人员该如何选择笔记本电脑?朋克老师来教你
- dropout的正则化理解
- 傅里叶变换的初级理解三
- 行星轨迹制作_FLASH做的八大行星的轨道图的教学
- cr3格式怎么转换成jpg_怎么把JPG格式转换为PDF?