HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
po.setIp(IpUtil.clientIp(req));
IpUtil.java
public class IpUtil { private static final Logger logger = LoggerFactory.getLogger(IpUtil.class); /** * 获取的是本地的IP地址 * * @return */ public static String serviceIp() { String result = ""; try { InetAddress address = InetAddress.getLocalHost(); result = address.getHostAddress(); } catch (UnknownHostException e) { logger.error("------>调用 IpUtil.servicerIp,错误信息如下"); logger.error(e.getMessage(), e); } return result; } /** * 获取的是该网站的ip地址,比如我们所有的请求都通过nginx的,所以这里获取到的其实是nginx服务器的IP地址 * * @param domain * @return */ public static String serviceIp(String domain) { String result = ""; if (ValidatorUtil.isNotNullOrEmpty(domain)) { try { InetAddress inetAddress = InetAddress.getByName(domain); result = inetAddress.getHostAddress(); } catch (UnknownHostException e) { logger.error("------>调用 IpUtil.servicerIp,错误信息如下"); logger.error(e.getMessage(), e); } } return result; } /** * 根据主机名返回其可能的所有Ip地址 * * @param domain * @return */ public static List<String> originalServiceIp(String domain) { List<String> result = new ArrayList<>(); if (ValidatorUtil.isNotNullOrEmpty(domain)) { try { InetAddress[] addresses = InetAddress.getAllByName(domain); for (InetAddress addr : addresses) { result.add(addr.getHostAddress()); } } catch (UnknownHostException e) { logger.error("------>调用 IpUtil.originalServicerIp,错误信息如下"); logger.error(e.getMessage(), e); } } return result; } /** * @param request * @return * @description: 如果通过了多级反向代理的话, * X-Forwarded-For的值并不止一个, 而是一串IP值, * 究竟哪个才是真正的用户端的真实IP呢? * 答案是取 X-Forwarded-For中第一个非unknown的有效IP字符串。 */ public static String clientIp(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; }
<audio controls="controls" style="display: none;"></audio>
相关推荐
System.out.println("客户端IP地址为:" + ipAddress); } } ``` 在上述代码中,`HttpServletRequest`的`getRemoteAddr()`方法用于获取客户端的IP地址。然而,如果应用部署在反向代理服务器(如Nginx)后,这个方法...
在Java编程中,获取客户端IP地址以及其归属地是一项常见的需求,这主要涉及到网络协议的理解以及第三方库的使用。在Web应用中,服务器通常需要识别来访用户的地理位置信息,以便进行个性化服务、安全控制或者数据...
在 Spring 框架中,获取客户端 IP 地址是一项常见的需求,特别是在日志记录、安全控制或地理位置信息处理等场景。Spring 提供了多种方式来获取请求中的 IP 地址,这通常涉及到 Web 开发环境中的网络通信。 首先,...
在Spring WebFlux 5.0.x版本中,由于其反应式架构的设计,`ServerRequest`并没有直接暴露获取客户端IP的API。这是一个设计决策,因为它鼓励开发者使用更非阻塞的方式来处理请求。而在Spring WebFlux 5.1及更高版本中...
在 Spring 框架中,获取客户端 IP 地址是一个常见的需求,尤其是在处理网络请求时,我们需要知道请求来源的 IP 地址来实现如日志记录、安全控制等功能。Spring 提供了多种方式来获取请求中的 IP 地址。 首先,我们...
服务提供者启动后,会向Eureka Server注册自己的元数据(如服务名、IP地址、端口等),而服务消费者则可以通过Eureka Server查询到服务提供者的信息,从而实现服务之间的调用。 在"eureka-client"中,我们看到了...
基于Spring Boot框架的知识付费资源管理系统 项目简介 ... IP地址获取通过多种方式获取客户端IP地址,支持反向代理环境。 IP过滤实现IP地址的过滤和限制访问功能,保障系统安全。 4. 数据库操作
本文将深入探讨如何在Spring Security中实现IP过滤器,以便控制访问应用的客户端IP地址。 首先,我们需要理解Spring Security的基本架构。它是一个多层次的组件模型,其中包括认证、授权和会话管理等核心功能。在...
在SpringBoot中,你可以将`GeoLocationService`注入到需要获取地理位置的控制器中,然后通过HTTP请求处理客户端的IP地址: ```java import org.springframework.beans.factory.annotation.Autowired; import org....
每个微服务启动时,都会向Eureka服务器注册自身的信息,包括服务名、IP地址和端口等。其他服务则通过Eureka获取到服务列表,实现服务之间的互相调用。 2. **Zuul**:作为API网关,Zuul处理所有客户端的请求,实现了...
服务提供者启动时会向Eureka Server注册自身信息,包括服务名、IP地址、端口等,而服务消费者则会在需要调用其他服务时查询Eureka Server获取服务提供者的地址信息。 21.尚硅谷_SpringCloud_EurekaServer服务注册...
// 获取客户端的 IP 地址 String ip = getClientIP(); // 获取提交参数 String params = getParams(); // 检查提交记录 if (isRepeatSubmit(ip, params, noRepeatSubmit.timeout())) { // 重复提交,抛出异常...
配置它们可以使你的服务通过服务名而不是IP地址来调用其他服务,从而实现服务间的通信。 例如,为Ribbon配置一个配置类: ```java @Configuration public class RibbonConfig { @Bean public IRule ribbonRule...
它负责存储和管理所有微服务的信息,包括服务名称、实例、IP 地址、端口号等。这样其他微服务可以通过服务注册中心来发现和调用该服务。 Consul 服务注册中心 Consul 是一个开源的服务注册中心和配置管理工具,由 ...
每个服务启动后,都会向 Eureka Server 注册自己的信息,包括服务名、IP 地址、端口等。其他服务通过 Eureka 可以找到并调用这些服务,实现服务之间的通信。 2. **负载配置**:Spring Cloud Config 提供了集中式的...
客户端负载均衡是运行在客户端程序中的,如我们的 web 项目,然后通过获取集群的 IP 地址列表,随机选择一个 server 发送请求。相对于服务端负载均衡来说,它不需要消耗服务器的资源。 要使用 Spring Cloud Ribbon ...
Consul还支持DNS查询,允许服务消费者通过服务名直接进行DNS解析,获取服务提供者的IP地址。这种方式对开发者友好,无需关心底层服务发现的具体实现,只需按照服务名进行调用即可。 4. **健康检查**: Consul内置...
Spring Cloud 提供了 Ribbon,这是一个内置的客户端负载均衡器,它可以与 Eureka 配合使用。在 `springcloud-order` 中,通过 Ribbon,请求会被自动分配到 `springcloud-member` 的多个实例上,从而实现本地负载...
服务消费者可以查询 Eureka 服务器获取服务提供者的地址,然后进行调用。Eureka 采用 RESTful API 进行通信,支持服务的注册、查询、健康检查等功能,并且具备自我保护机制,能有效防止网络延迟导致的服务不可用问题...
Spring Cloud提供了Eureka作为服务注册中心,允许各个服务实例在启动时向Eureka服务器注册自己的元数据(如服务名、IP地址、端口等)。服务消费者可以通过Eureka获取到服务提供者的列表,以便进行下一步的服务调用。...