当前位置: 首页 > article >正文

获取 jakarta.servlet.http.HttpServletRequest请求IP

为了从 jakarta.servlet.http.HttpServletRequest 获取客户端的IP地址,你可以编写一个辅助方法来检查多个HTTP头信息以确定客户端的真实IP地址。考虑到可能存在的代理服务器或负载均衡器,直接使用 request.getRemoteAddr() 可能无法获取到真实的客户端IP。

下面是一个示例方法,用于从 HttpServletRequest 对象中提取客户端的IP地址:

import jakarta.servlet.http.HttpServletRequest;

public class IpAddressUtil {

    public static String getClientIp(HttpServletRequest request) {
        // Check for headers commonly used by proxies to forward the original IP address.
        String ip = request.getHeader("X-Forwarded-For");
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }

        // If the IP address is still unknown, return null or a default value.
        if ("0:0:0:0:0:0:0:1".equals(ip) || "127.0.0.1".equals(ip)) {
            // Localhost address, you might want to handle this specially.
            return "localhost";
        }

        // For cases where there are multiple IPs in the X-Forwarded-For header,
        // take the first one as the client's IP address.
        if (ip != null && ip.contains(",")) {
            ip = ip.split(",")[0].trim();
        }

        return ip;
    }
}

这段代码首先尝试通过常见的HTTP头部字段(如 X-Forwarded-For)获取IP地址,这些字段通常由代理服务器设置。如果这些头部不存在或包含未知值,则最终回退到使用 getRemoteAddr() 方法。

请注意,由于HTTP头部可以被客户端伪造,因此在安全敏感的应用中应该谨慎处理,并且可能需要对来自代理或负载均衡器的请求进行额外验证。如果你使用的是像Hutool这样的库,它们通常已经提供了类似的实用方法来简化这个过程。


http://www.kler.cn/a/452515.html

相关文章:

  • ViT-Reg:面向tinyML平台的回归聚焦型硬件感知微调Vision Transformer
  • Vue开发环境搭建上篇:安装NVM和NPM(cpnm、pnpm)
  • 在MySQL 主库上进行自动清理 purged gtid 时,会等待 binlog复制到从库吗
  • 使用Vue的props进行组件传递校验时出现 Extraneous non-props attributes的解决方案
  • 精准提升:从94.5%到99.4%——目标检测调优全纪录
  • MongoDB 常用操作指南(Docker 环境下)
  • 【stm32can】
  • C# Winform打开和预览PDF,方法一:调用CefSharp包,内嵌浏览器
  • EMS(energy managment system)从0到1
  • 软考架构师笔记-计算机系统组成-1
  • 10. zynq应用开发--camke编译
  • 【每日学点鸿蒙知识】Charles抓包、lock文件处理、WebView组件、NFC相关、CallMethod失败等
  • Spring源码_05_IOC容器启动细节
  • Oracle 备份与恢复 (Docker部署版)
  • 单机服务和微服务
  • 模型的量化(Quantization)
  • 一篇梳理清楚JavaScript ES6中的Promise
  • [WASAPI]音频API:从Qt MultipleMedia走到WASAPI,相似与不同
  • 钢材缺陷识别分割数据集labelme格式693张4类别
  • leetcode hot100 将有序数组转化为二叉搜索树
  • 微服务: 06-rabbitmq设置延时队列,场景与使用(springboot)
  • 图神经网络_图嵌入_SDNE
  • 【Rust自学】6.4. 简单的控制流-if let
  • 【每日学点鸿蒙知识】指纹识别隐藏背面、数组内部值变化刷新UI、键盘输入类型、跨组件路由、C++20特性支持
  • 智谱BigModel研习社|搭建 AI 搜索引擎 - 使用免费的Web-Search-Pro+脑图Agent智能体
  • Gmsh有限元网格剖分(Python)---点、直线、平面的移动