`

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
 
 
 
 
  1. getRemoteAddr()是获得客户端的ip地址    
  2. getRemoteHost()是获得客户端的主机名
  3. 获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了(比如负载均衡处理)。
  4. public String getRemortIP(HttpServletRequest request) {  
  5.   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
分享到:
评论

相关推荐

    asp.net getRemoteAddr()与 getRemoteHost()的区别

    getRemoteAddr():获得客户端的IP地址 getRemoteHost():获得客户端电脑的名字,若失败,则返回客户端电脑的IP地址 InetAddress ia = InetAddress.getLocalHost(); String iad = ia.getHostAddress();//主机IP ...

    JSP课件--JSP基本语法与使用环境

    `getServerName()`和`getServerPort()`分别返回服务器的主机名和端口号,`getRemoteAddr()`和`getRemoteHost()`获取客户端的IP地址和主机名。`getRealPath(String path)`将虚拟路径转换为服务器上的实际文件路径。 ...

    servlet面试题集锦1

    - `ServletRequest.getRemoteHost()`:返回客户端主机的完全限定域名。 - `ServletRequest.getRemoteAddr()`:返回客户端的IP地址。 - `ServletRequest.getHeader(String name)`:根据指定的名称获取请求头的值,...

    jsp内置对象

    例如,你可以使用`getAttribute()`来获取请求中携带的自定义属性,`getParameter()`来获取表单提交的数据,`getHeader()`获取HTTP头部信息,`getRemoteAddr()`和`getRemoteHost()`则分别用来获取客户端的IP地址和...

    SCWCD考前复习笔记!

    **HttpServletRequest**:提供了获取请求信息的方法,如`getParameter()`用于获取特定参数的值,`getParameterValues()`用于获取多个值,`getParameterNames()`获取所有参数名,`getRemoteAddr()`和`getRemoteHost...

    JSP中的九大内置对象[归纳].pdf

    `request`对象提供了多种方法来获取请求信息,如`getAttribute()`用于获取指定名称的属性值,`getParameter()`用于获取请求参数,`getRemoteAddr()`和`getRemoteHost()`分别返回客户端的IP地址和主机名。此外,`...

    Java web servlet笔记

    4. `getRemoteAddr()`和`getRemoteHost()`:分别获取客户端的IP地址和主机名。 5. `getLocalAddr()`、`getLocalPort()`和`getLocalName()`:获取服务器的IP地址、端口和主机名。 6. `getHeader(String name)`和`...

    javaip的获取方式

    下面将详细介绍如何使用`HttpServletRequest`对象来获取客户端和服务器的IP地址及相关信息。 ##### 1. `getLocalAddr()` 此方法用于获取服务器的本地IP地址。它返回的是字符串形式的IP地址,如`"192.168.1.1"`。 ...

    JSP内置对象实验报告.doc

    * getRemoteAddr():获取客户端的IP地址 * getRemoteHost():获取客户端的主机名 * getParameter():获取请求的参数 * getParameterNames():获取请求的参数名称 在实验代码中,我们使用request对象获取了客户端的...

    JAVA程序员面试题

    getRemoteAddr():获取客户端的IP地址 getRemoteHost():获取客户端的名字 getSession([Boolean create]):返回和请求相关Session getServerName():获取服务器的名字 getServletPath():获取客户端所请求的脚本文件...

    javaWEB总结(6):ServletRequest

    5. **获取客户端信息**:`getRemoteAddr()`和`getRemoteHost()`分别获取客户端的IP地址和主机名,`getRemoteUser()`获取经过验证的用户名。 6. **会话管理**:`getSession()`和`getSession(boolean create)`方法...

    httpservletRequest的学习笔记

    1. `getRemoteAddr()`:返回发出请求的客户端的IP地址,这对于跟踪和日志记录非常有用。 2. `getRemoteHost()`:返回客户端的完全限定域名。 3. `getServerName()`和`getServerPort()`:分别返回服务器的名称和端口...

    JSP学习总结.pdf

    - `getRemoteAddr()`和`getRemoteHost()`:获取客户端的IP地址和主机名。 5. **示例代码**: 以下是一个简单的JSP页面,展示如何使用request对象: ```jsp ;charset=UTF-8" language="java" %> ...

    LogFilter (2)_javaweb_

    例如,我们可以使用`HttpServletRequest`的`getRemoteAddr()`方法获取远程客户端的IP地址,`getRemoteHost()`获取远程主机名,`getRequestURI()`获取请求的资源URI。然后,将这些信息格式化后写入日志文件。为了实现...

    JSP对象及使用方法(带例子)

    - 使用`getRemoteAddr`和`getRemoteHost`获取客户端信息。 - 使用`getParameter`获取表单提交的数据。 ###### 例2:获取表单数据 ```jsp ;charset=gb2312" %> ("gb2312"); %> <title>request对象_例2 ...

    Java Web应用开发 19 课堂案例-全面认识request的常用方法.docx

    6. `request.getRemoteHost()`:与`getRemoteAddr()`类似,但这个方法会尝试解析客户端的主机名,如果IP地址可以转换为主机名,它会返回主机名,否则返回IP地址。在需要识别客户端身份或者进行地理定位时,此方法...

    JSP2_0技术学习笔记

    `request.getContextPath()`、`request.getMethod()`、`request.getProtocol()`、`request.getQueryString()`、`request.getRequestedSessionId()`、`request.getRequestURI()`、`request.getRemoteAddr()`和`...

Global site tag (gtag.js) - Google Analytics