返回

如何在 Quarkus Web 应用程序中通过拦截器获取客户端 IP 地址?

java

在 Quarkus Web 应用程序中通过拦截器获取客户端 IP 地址

在开发 Quarkus Web 应用程序时,我们需要记录 HTTP 请求的详细信息,其中包括客户端的 IP 地址。拦截器提供了访问请求相关信息的一种便利方式。本文将指导您如何使用拦截器在 Quarkus Web 应用程序中获取客户端 IP 地址。

依赖项配置

要访问 HttpServletRequest 对象,我们需要在 pom.xml 文件中添加以下依赖项:

<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-resteasy-common</artifactId>
</dependency>

获取客户端 IP 地址

在拦截器中,我们可以使用 HttpServletRequest 来获取客户端 IP 地址。有两种方法可以做到:

方法 1:使用 request.getRemoteAddr()

String ipAddress = request.getRemoteAddr();

此方法返回客户端的 IP 地址,但它可能不准确,因为客户端可能使用了代理服务器。

方法 2:使用 request.getHeader("X-Forwarded-For")

String ipAddress = request.getHeader("X-Forwarded-For");

此方法返回代理服务器设置的 X-Forwarded-For 标头,其中包含客户端的真实 IP 地址。如果请求没有通过代理服务器发送,则此方法将返回 null

更新拦截器

现在我们可以使用上面介绍的方法获取 IP 地址,我们可以更新拦截器以获取并记录客户端 IP 地址:

@Loggable
@Interceptor
@Priority(1)
public class Logger {
    
    @Inject
    private LogService logService;
    
    @Inject
    private HttpServletRequest request;
    
    @AroundInvoke
    public Object logMethodEntry(InvocationContext context) throws Exception {
        Date currentDateAndTime = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        String dateAndTime = dateFormat.format(currentDateAndTime);
        String methodName = context.getTarget().getClass().getName() + "." + context.getMethod().getName();
        String ipAddress = request.getRemoteAddr();

        Log log = new Log(dateAndTime, ipAddress, methodName);
        logService.addLog(log);
        return context.proceed();
    }
}

常见问题解答

1. 我应该使用哪种方法来获取 IP 地址?

如果确定客户端没有使用代理服务器,则可以使用 request.getRemoteAddr() 方法。否则,建议使用 request.getHeader("X-Forwarded-For") 方法。

2. 如果客户端使用了多个代理服务器会怎样?

X-Forwarded-For 标头是一个逗号分隔的字符串,其中包含所有代理服务器的 IP 地址。在这种情况下,客户端的真实 IP 地址将是第一个 IP 地址。

3. 如何处理 X-Forwarded-For 标头不可用?

如果 X-Forwarded-For 标头不可用,则可以回退到使用 request.getRemoteAddr() 方法。但是,请注意,这可能不会返回客户端的真实 IP 地址。

4. 如何获取客户端端口号?

使用 request.getRemotePort() 方法可以获取客户端端口号。

5. 如何获取客户端主机名?

使用 request.getRemoteHost() 方法可以获取客户端主机名。

结论

通过使用拦截器,我们可以在 Quarkus Web 应用程序中轻松获取客户端 IP 地址。这对于记录请求详细信息和进行安全检查非常有用。通过理解文中介绍的方法,您现在可以轻松地将此功能集成到您的应用程序中。