首页 > 其他分享 >Spring 框架获取请求 IP

Spring 框架获取请求 IP

时间:2024-08-09 17:28:27浏览次数:14  
标签:IP String 框架 Spring request IP地址 ipAddress

在处理HTTP请求时,获取原始IP地址有时是必要的,特别是在反向代理或负载均衡器后面运行应用程序时。原始IP地址指的是客户端(用户)的IP地址,而不是代理服务器的地址。

以下是几种获取原始IP地址的方法:

1. 使用HTTP头部

- 有时代理服务器会设置特定的HTTP头部,如`X-Forwarded-For`,来传递原始IP地址。但请注意,这种方法依赖于代理服务器的配置,并且可以被客户端伪造。

   String xForwardedFor = request.getHeader("X-Forwarded-For");
   if (xForwardedFor != null && !xForwardedFor.isEmpty()) {
       // 通常第一个IP是原始IP地址
       String originalIP = xForwardedFor.split(",")[0];
   }

2. 使用Servlet API

- `HttpServletRequest`提供了`getRemoteAddr`方法来获取发起请求的客户端IP地址。但如果没有代理,这将返回服务器接收到请求的IP地址,可能是代理服务器的地址。

   String remoteAddr = request.getRemoteAddr();

3. 配置Spring Boot以信任特定的头部

- 如果您使用Spring Boot,可以在`application.properties`或`application.yml`中配置应用程序以信任`X-Forwarded-For`头部。

   server.use-forward-headers=true

   然后在代码中使用`getRemoteAddr`方法。

4. 使用Spring框架的`RequestHeaderUtility`

 - Spring提供了`RequestHeaderUtility`类,可以帮助您从请求中提取原始IP地址。

   RequestHeaderUtility headerUtility = new RequestHeaderUtility(request);
   String originalIP = headerUtility.getForwardedFor();

5. 使用Spring Security

- 如果您的应用程序使用Spring Security,您可以配置它来处理原始IP地址。

6. 注意

- 获取原始IP地址的方法可能因应用程序的部署环境和配置而异。
- 始终验证和测试您的实现,以确保它在您的特定环境中正常工作。

以下是一个示例,展示如何在Spring Boot应用程序中配置和获取原始IP地址:

public class(){
	private static final String UNKNOWN = "unknown";
    private static final String LOCALHOST = "127.0.0.1";
    private static final String SEPARATOR = ",";
    
    public String getIpAddress(HttpServletRequest request){
      String ipAddress;
          try {
              ipAddress = request.getHeader("x-forwarded-for");
              if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                  ipAddress = request.getHeader("Proxy-Client-IP");
              }
              if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                  ipAddress = request.getHeader("WL-Proxy-Client-IP");
              }
              if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) {
                  ipAddress = request.getRemoteAddr();
                  if (LOCALHOST.equals(ipAddress)) {
                      InetAddress inet = null;
                      try {
                          inet = InetAddress.getLocalHost();
                      } catch (UnknownHostException e) {
                          e.printStackTrace();
                      }
                      ipAddress = inet.getHostAddress();
                  }
              }
              // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
              // "***.***.***.***".length()
              if (ipAddress != null && ipAddress.length() > 15) {
                  if (ipAddress.indexOf(SEPARATOR) > 0) {
                      ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
                  }
              }
          } catch (Exception e) {
              ipAddress = "";
          }
          System.out.println(ipAddress);
          return ipAddress;
	}

}


 

标签:IP,String,框架,Spring,request,IP地址,ipAddress
From: https://blog.csdn.net/weixin_37549398/article/details/141066570

相关文章

  • BootStrap ToolTip内容换行
    1一说是改源码template:'<divclass="tooltip"role="tooltip">'+'<divclass="tooltip-arrow"></div>'+'<divclass="tooltip-inner"></div>'+'</div>......
  • Spring Cloud接入Nacos作为配置中心和服务发现
    一、nacos介绍Nacos是DynamicNamingandConfigurationService(动态命名和配置服务)的首字母简称,它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos由阿里巴巴开源,致力于帮助用户发现、配置和管理微服务。以下是Nacos的详细介绍:动态服务发现:Nacos......
  • 十大java开发框架总结,微服务开发必备!
     提起java开发框架,大部分工程师可能主要使用的是ssh三件套,在当前微服务作为开发主流的时代,我们有必要也了解下其他java开发框架。1.SpringBoot SpringBoot是当前Java开发框架的首选,几乎是行业标准了。由轻量级Java开发框架spring进化而来。一直被模仿,从未被超越。2. Quar......
  • 常用的ORM框架
    在.NETCore中,以下是一些常用的ORM(对象关系映射)框架,适合快速上手和使用:1.EntityFrameworkCore描述:这是微软开发的ORM框架,支持LINQ查询、数据库迁移等功能。优点:与ASP.NETCore无缝集成。支持代码优先和数据库优先两种开发模式。强大的社区支持和丰富的文档。......
  • 基于django+vue框架的贵州农产品销售平台设计与实现【开题报告+程序+论文】-计算机毕
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,随着电子商务的蓬勃发展和乡村振兴战略的深入实施,农产品上行通道的建设成为推动农村经济转型升级的关键一环。贵州,作为中国西南地区......
  • 基于django+vue框架的共享汽车管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和环保意识的提升,共享汽车作为一种新型的出行方式,正逐渐受到公众的青睐。它不仅有效缓解了城市交通拥堵问题,还减少了......
  • Spring Boot 常见注解的用法和功能
    ​前言        SpringBoot提供了大量注解,主要用于简化配置和开发,大致可分为核心注解、Web注解、依赖注入注解、数据访问注解、配置注解、条件注解、测试注解。一、核心注解@SpringBootApplication        作用: 标注一个主程序类,表明这是一个SpringBoo......
  • Applescript实现无痕检测是否注册iMessage服务,iMessages数据筛选,iMessage蓝号检测完
    一、实现iMessage蓝号数据筛选的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2.编写脚本......
  • SpringBoot日志的使用
    背景:在生产环境中,排程问题都是通过日志,所以日志很重要。日志有三个部分组成LoggerAppenderLayout一般日志都会有对应的配置文件,log4j2.xml或者是logback-spring.xml,日志的输出格式在Pattern标签中1、确认日志框架:确认日志框架是log4j2、logback还是其他的......
  • 大数据框架之一——Hadoop学习第四天
    1、MapReduce序列化(接着昨天的知识继续学习)序列化(Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。当两个进程在进行远程通信时,彼......