`
Action-人生
  • 浏览: 104758 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

X-Forwarded-For 和 X-Real-IP 的区别?

    博客分类:
  • JAVA
阅读更多
        X-Forwarded-For 和 X-Real-IP 的区及获取客户端的ip?

一般来说,X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中

来自4.4.4.4的一个请求,header包含这样一行

X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
代表 请求由1.1.1.1发出,经过三层代理,第一层是2.2.2.2,第二层是3.3.3.3,而本次请求的来源IP4.4.4.4是第三层代理

而X-Real-IP,一般只记录真实发出请求的客户端IP,上面的例子,如果配置了X-Read-IP,将会是

X-Real-IP: 1.1.1.1
所以 ,如果只有一层代理,这两个头的值就是一样的


第一种
  /**
      * 从Request对象中获得客户端IP,处理了HTTP代理服务器和Nginx的反向代理截取了ip
      * @param request
      * @return ip
      */
    public static String getLocalIp(HttpServletRequest request) {
        String remoteAddr = request.getRemoteAddr();
        String forwarded = request.getHeader("X-Forwarded-For");
        String realIp = request.getHeader("X-Real-IP");

        String ip = null;
        if (realIp == null) {
            if (forwarded == null) {
                ip = remoteAddr;
            } else {
                ip = remoteAddr + "/" + forwarded.split(",")[0];
            }
        } else {
            if (realIp.equals(forwarded)) {
                ip = realIp;
            } else {
                if(forwarded != null){
                    forwarded = forwarded.split(",")[0];
                }
                ip = realIp + "/" + forwarded;
            }
        }
        return ip;
    }

第二种
public static String getIp(HttpServletRequest request) {
         String remoteAddr = request.getRemoteAddr();
          String forwarded = request.getHeader("X-Forwarded-For");
          String realIp = request.getHeader("X-Real-IP");
  
          String ip = null;
          if (realIp == null) {
              if (forwarded == null) {
                  ip = remoteAddr;
             } else {
                 ip = remoteAddr + "/" + forwarded;
             }
         } else {
             if (realIp.equals(forwarded)) {
                 ip = realIp;
             } else {
                 ip = realIp + "/" + forwarded.replaceAll(", " + realIp, "");
             }
         }
         return ip;
     }

第三种
   public static String getIp2(HttpServletRequest request) {
             String ip = request.getHeader("X-Forwarded-For");
             if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
                 //多次反向代理后会有多个ip值,第一个ip才是真实ip
                 int index = ip.indexOf(",");
                 if(index != -1){
                     return ip.substring(0,index);
                 }else{
                     return ip;
                }
            }
            ip = request.getHeader("X-Real-IP");
            if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
                return ip;
            }
            return request.getRemoteAddr();
       }
分享到:
评论

相关推荐

    X-Forwarded-For Nginx 文档整理

    在进行测试时,我们可以使用curl命令或者浏览器直接访问配置好的Node.js服务器和Nginx反向代理,观察`X-Forwarded-For`和`X-Real-IP`头的变化,以验证它们的工作机制。 总结来说,`X-Forwarded-For`和`X-Real-IP`是...

    gin-gonic-realip:Gin的Real IP中间件将http.Request的RemoteAddr设置为解析X-Forwarded-For标头或X-Real-IP标头的结果

    的Real IP中间件,将http.Request的RemoteAddr设置为解析X-Forwarded-For标头或X-Real-IP标头的结果。 用法 package main import ( "github.com/gin-gonic/gin" "github.com/thanhhh/gin-gonic-realip" ) func ...

    获取客户端ip

    ### 获取客户端真实IP地址 ...通过使用`X-Forwarded-For`字段和其他相关字段的信息,可以有效地解决在存在代理服务器的情况下获取客户端真实IP地址的问题。上述两种方法可以根据实际需求选择使用。

    jsp页面得到客户端的真是ip

    String realIP = request.getHeader("x-forwarded-for"); String ip = request.getRemoteAddr(); Enumeration<String> enumNames = request.getHeaderNames(); // 打印所有 header 名称及其值 while ...

    Laravel开发-laravel-cloudflare-real-ip

    如果`CF-Connecting-IP`不存在,可以尝试从`X-Forwarded-For`中提取第一个IP地址。 ```php public function handle(Request $request, Closure $next) { $forwardedFor = $request->headers->get('X-Forwarded-For...

    Nginx作为反向代理时传递客户端IP的设置方法

    nginx默认配置文件里面是没有进行日志转发配置的,这个需要我们自己手动来操作了,当然后端的real server不同时操作方法是不一样的,这里我们分别例举几种情况来说明一下。 nginx做前端,转发日志到后端nginx服务器...

    获取访问者真实的IP地址

    2. **处理 `X-Forwarded-For`**:如果`X-Real-IP`不存在或为"unknown",则从`X-Forwarded-For`头中获取IP地址。该头部可能包含多个IP地址,通过逗号分隔。此时取第一个IP地址作为客户端的真实IP地址。 3. **处理 `...

    Nginx代理时header头中带”_”信息丢失问题的解决

    前言 开发网关项目时,在请求时往请求头header中放入... proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Nginx-Proxy true; add_header Pro

    获取用户真实IP地址

    const realIp = req.headers['x-real-ip'] || req.headers['x-forwarded-for']; if (Array.isArray(realIp)) { realIp = realIp.split(',')[0]; } console.log('Real IP:', realIp); next(); }); app.listen...

    flex跨域上传

    proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://localhost:8080/zwh/; } } server { listen 80; server_name test1.zwh.com; location / { proxy_set_header Host $host; proxy_...

    PHP通过$_SERVER['REMOTE_ADDR']得到的是内网IP?如何才能获得客户的公网IP(真实IP地址).zip

    3. **多级代理判断**:如果存在多级代理,`X-Forwarded-For`可能包含多个IP,一般最后一个才是用户的真实IP。但要确保过滤掉可能的伪造IP,例如: ```php $forwarded_ips = explode(',', $_SERVER['...

    Java面试之如何获取客户端真实IP

    Java获取客户端真实IP ...在Java中获取客户端真实IP需要使用X-Real-IP和X-Forwarded-For请求头,并在nginx配置文件中添加相应的配置。这样,我们就可以获取客户端的真实IP,并实现分享功能的地区辨识功能。

    nginx做反向代理时的真实IP_nginx反向代理_

    当Nginx接收到客户端请求时,我们可以配置Nginx将客户端IP添加到`X-Real-IP`头部,然后在后端服务器的处理逻辑中读取这个头部。 以下是配置Nginx反向代理获取真实IP的步骤: 1. 打开Nginx配置文件(通常是 `/etc/...

    7kbscan-WebPathBrute v1.6.0 最新编译版

    X-Forwarded-For是用于记录代理信息的,每经过一级代理X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中,来自4.4.4.4的一个请求,...

    windows下配置nginx反向代理tomcat

    - **`proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for`**:设置 `X-Forwarded-For` 头部字段,记录客户端的真实 IP 和中间经历的多层代理的 IP 集合。 - **`proxy_set_header X-Forwarded-Proto $...

    Nginx基础学习之realip模块的使用方法

    其格式通常为`X-Forwarded-For: client, proxy1, proxy2`,其中`client`是原始客户端IP,`proxy1`和`proxy2`是依次经过的代理服务器IP。`X-Real-IP`头部类似,但通常由上一个代理服务器添加,表示的是上一个连接的IP...

    nginx经过多层代理后获取真实来源ip过程详解

    问题 nginx取 $remote_addr 当做真实ip,而事实...real_ip_header X-Forwarded-For; real_ip_recursive on; 添加之后启动nginx报错: nginx: [emerg] unknown directive set_real_ip_from in /home/lnidmp/nginx/conf/

    restrict-ip-koa-middleware

    自定义方式获取 IP 地址:取 IP 地址可用自定义方式,例如从 Header 里取 x-forwarded-for 或者 x-real-ip 字段等 自定义拦截后的处理方法:可自定义返回消息体,允许有特判逻辑放行特定的请求 基本用法 const Koa =...

    Nginx屏蔽F5心跳日志、指定IP访问日志

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://mmt; # 这里添加了if条件判断,不记录来自F5内网地址192.168.0.2的访问日志 if ($remote_addr != 192.168.0.2) { access_...

Global site tag (gtag.js) - Google Analytics