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
- getRemoteAddr()是获得客户端的ip地址
- getRemoteHost()是获得客户端的主机名
- 获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了(比如负载均衡处理)。
- public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
//return request.getRemoteHost();
}
return request.getHeader("x-forwarded-for");
}
此处,获取ip,当x-forwarded-for为null时,表示请求没有经过处理,此时调用getRemoteAddr()和getRemoteHost()都可获取真实ip
反之,则getHeader("x-forwarded-for")为真实的ip
相关推荐
getRemoteAddr():获得客户端的IP地址 getRemoteHost():获得客户端电脑的名字,若失败,则返回客户端电脑的IP地址 InetAddress ia = InetAddress.getLocalHost(); String iad = ia.getHostAddress();//主机IP ...
`getServerName()`和`getServerPort()`分别返回服务器的主机名和端口号,`getRemoteAddr()`和`getRemoteHost()`获取客户端的IP地址和主机名。`getRealPath(String path)`将虚拟路径转换为服务器上的实际文件路径。 ...
- `ServletRequest.getRemoteHost()`:返回客户端主机的完全限定域名。 - `ServletRequest.getRemoteAddr()`:返回客户端的IP地址。 - `ServletRequest.getHeader(String name)`:根据指定的名称获取请求头的值,...
例如,你可以使用`getAttribute()`来获取请求中携带的自定义属性,`getParameter()`来获取表单提交的数据,`getHeader()`获取HTTP头部信息,`getRemoteAddr()`和`getRemoteHost()`则分别用来获取客户端的IP地址和...
**HttpServletRequest**:提供了获取请求信息的方法,如`getParameter()`用于获取特定参数的值,`getParameterValues()`用于获取多个值,`getParameterNames()`获取所有参数名,`getRemoteAddr()`和`getRemoteHost...
`request`对象提供了多种方法来获取请求信息,如`getAttribute()`用于获取指定名称的属性值,`getParameter()`用于获取请求参数,`getRemoteAddr()`和`getRemoteHost()`分别返回客户端的IP地址和主机名。此外,`...
4. `getRemoteAddr()`和`getRemoteHost()`:分别获取客户端的IP地址和主机名。 5. `getLocalAddr()`、`getLocalPort()`和`getLocalName()`:获取服务器的IP地址、端口和主机名。 6. `getHeader(String name)`和`...
下面将详细介绍如何使用`HttpServletRequest`对象来获取客户端和服务器的IP地址及相关信息。 ##### 1. `getLocalAddr()` 此方法用于获取服务器的本地IP地址。它返回的是字符串形式的IP地址,如`"192.168.1.1"`。 ...
* getRemoteAddr():获取客户端的IP地址 * getRemoteHost():获取客户端的主机名 * getParameter():获取请求的参数 * getParameterNames():获取请求的参数名称 在实验代码中,我们使用request对象获取了客户端的...
getRemoteAddr():获取客户端的IP地址 getRemoteHost():获取客户端的名字 getSession([Boolean create]):返回和请求相关Session getServerName():获取服务器的名字 getServletPath():获取客户端所请求的脚本文件...
5. **获取客户端信息**:`getRemoteAddr()`和`getRemoteHost()`分别获取客户端的IP地址和主机名,`getRemoteUser()`获取经过验证的用户名。 6. **会话管理**:`getSession()`和`getSession(boolean create)`方法...
1. `getRemoteAddr()`:返回发出请求的客户端的IP地址,这对于跟踪和日志记录非常有用。 2. `getRemoteHost()`:返回客户端的完全限定域名。 3. `getServerName()`和`getServerPort()`:分别返回服务器的名称和端口...
- `getRemoteAddr()`和`getRemoteHost()`:获取客户端的IP地址和主机名。 5. **示例代码**: 以下是一个简单的JSP页面,展示如何使用request对象: ```jsp ;charset=UTF-8" language="java" %> ...
例如,我们可以使用`HttpServletRequest`的`getRemoteAddr()`方法获取远程客户端的IP地址,`getRemoteHost()`获取远程主机名,`getRequestURI()`获取请求的资源URI。然后,将这些信息格式化后写入日志文件。为了实现...
- 使用`getRemoteAddr`和`getRemoteHost`获取客户端信息。 - 使用`getParameter`获取表单提交的数据。 ###### 例2:获取表单数据 ```jsp ;charset=gb2312" %> ("gb2312"); %> <title>request对象_例2 ...
6. `request.getRemoteHost()`:与`getRemoteAddr()`类似,但这个方法会尝试解析客户端的主机名,如果IP地址可以转换为主机名,它会返回主机名,否则返回IP地址。在需要识别客户端身份或者进行地理定位时,此方法...
`request.getContextPath()`、`request.getMethod()`、`request.getProtocol()`、`request.getQueryString()`、`request.getRequestedSessionId()`、`request.getRequestURI()`、`request.getRemoteAddr()`和`...