• Tomcat 8.5中获取客户端真实IP及协议


    获取客户端真实IP
    ServletRequest接口提供了getRemoteAddr方法用于获取客户端IP,但是当客户端通过代理服务器访问后端服务器的时候,服务器调用getRemoteAddr方法会返回最近的代理服务器的IP而非客户端真实IP。这种情况下通常是使用X-Forwarded-For请求头来获取客户端真实IP。
    X-Forwarded-For简称XFF头,它保存了客户端和各级代理服务器的IP,只有在通过了HTTP正向代理服务器或者反向代理服务器时才会添加该项,一般格式如下:X-Forwarded-For: client1, proxy1, proxy2。基本流程是,当client1发出请求且请求没有经过任何的代理服务器,那么此时没有X-Forwarded-For;当请求经过proxy1的时候,proxy1将client1的IP添加到X-Forwarded-For中,此时X-Forwarded-For: client1;当请求经过proxy2的时候,proxy2将proxy1的IP添加到X-Forwarded-For中,此时X-Forwarded-For: client1, proxy1,以此类推。它在正向代理软件(如Squid)和反向代理软件(如Nginx)中都是标准用法。
    X-Real-IP没有相关的标准,可以在代理中配置这个请求头的值为客户端真实IP,但是还是推荐使用X-Forwarded-For,因为Nginx一般配置X-Real-IP为$remote_addr,如果经过多级代理,就无法拿到客户端真实IP了。
    以Nginx反向代理为例,Nginx里配置如下:
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
    proxy_set_header指令用于设置HTTP请求头,$remote_addr变量表示客户端IP,$proxy_add_x_forwarded_for变量表示客户端HTTP请求头中的X-Forwarded-For再加上“,”和$remote_addr。
    在Tomcat中可以使用如下代码获取客户端真实IP:
    String ip = request.getHeader("x-forwarded-for");
    if (ip != null && ip.length() != 0) {
    if (ip.indexOf(",") != -1) {
    ip = ip.split(",")[0];
    }
    }
     
    获取真实请求协议
    一般情况下,反向代理服务器请求后端服务器时是采用http协议,而客户端访问反向代理服务器时是采用https协议,这种情况下,后端服务器302重定向到某个相对路径时会读取到请求的协议为http,导致Location响应头指中的URL的协议为http,重定向失败。
    Tomcat的org.apache.catalina.valves.RemoteIpValve可以用来解决上述问题。
    以Nginx反向代理为例,Nginx里配置如下:
    proxy_set_header X-Forwarded-Proto $scheme
    $scheme表示请求协议,值为http或https。
    Tomcat配置如下:
    <Host name="localhost" appBase=......>
    <Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto" />
    <Context path="/" docBase=....../>
    </Host>
  • 相关阅读:
    三目运算符不易发现的错误
    [转]理解C# 4 dynamic(1)
    [转]C# and the using Statement in 3 seconds and a bug in Reflector
    异步上传文件多种方式归纳
    JQuery的两个each方法的注意点
    CRM2011 concurrency问题及解决方案
    [转]Android与电脑局域网共享之:Samba Client
    [转]Android与电脑局域网共享之:Samba Server
    [转]SQL2005后的ROW_NUMBER()函数的应用
    Javascript中布尔运算符的高级应用
  • 原文地址:https://www.cnblogs.com/gjb724332682/p/8763118.html
Copyright © 2020-2023  润新知